On 9/22/07, Andrew WC Brown <[EMAIL PROTECTED]> wrote:
> I've written a story and I run into a snag.
> I've written the create_forum method and told it to set the id to 1
> but when it creates the forum the id is autoincremented.
> My forums table is empty but the id keeps incrementing the newest record on
> creation.
> When I run the story it comes out as something like 59 which fails my story
> because I'm asking it to look at /forums/1
>
> I thought of using my named routes instead of specifying the path as a
> string.
> That worked up until the point when I reached:
>
> When "creating a new topic titled", "Nicks Mom" do |title|
> post topics(@forum, ??? ), :topic => { :title => title, :body => "She is
> teh hotZ!" }
> end
>
> The problem was since its a nested routed I couldn't complete the post
> request without specifying the topic_id.
> But since the topic hasn't been created yet their is no way (that I know of)
> to pass the id since I don't know what it will be.
>
> I would think the better practice is to state the paths as strings instead
> of using the nested routes.
>
>
>
> require File.join(File.dirname(__FILE__), "helper")
>
> Story "User creates a new topic", %{
> As a user
> I want to create a new topic
> So that I can dicuss Nick's Mom
> }, :type => RailsStory do
>
> Scenario "Successfully create a new topic in the 'General' forum" do
>
> Given "a user named", "Jon" do |login|
> @user = create_user login
> end
> Given "a forum named", "General" do |name|
> @forum = create_forum name
> puts @forum.id
> end
>
> And "user logged in successfully and was redirect to", "/" do |path|
> post "/session/create", :login => "Jon", :password => "your_momma"
> response.should redirect_to("/")
> end
>
> And "user is looking at", "/forums/1" do |path|
> get path
> response.should be_success
> end
>
> When "creating a new topic titled", "Nicks Mom" do |title|
> post "/forums/1/topics/1/create", :topic => { :id => 1, :title =>
> title, :body => "She is teh hotZ!" }
> end
>
> Then "user should be redirected to", "/forums/1/topics/1" do |path|
> get path
> response.should be_success
> end
>
> end
>
> Scenario "Failed creating a new topic due to blank fields" do; end
> Scenario "Sticky a new thread" do; end
> Scenario "Annoucment as a new thread" do; end
> end
>
> def create_user(login)
> user = User.create!(
> :login => login,
> :email => " [EMAIL PROTECTED]",
> :password => "your_momma",
> :password_confirmation => "your_momma",
> :display_name => "Jon")
> user
> end
>
> def create_forum(name)
> forum = Forum.create!(
> :id => 1,
> :name => name,
> :description => "Everything from the latest gossip to the coolest
> youtube videos.")
> forum
> end
>
>
> How do I stop the incrementing?
>
> _______________________________________________
> rspec-users mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users
>
You don't stop the incrementing (at least afaik). That's a db thing.
You'd have to drop and recreate the db between runs. The good news is
that the instance variables that you created are available everywhere
within the Scenario.
I wrote a story that is very similar to yours. I only rebuilt the
bits that were relevant to the test:
require File.join(File.dirname(__FILE__), "helper")
Story "User creates a new topic", %{
As a user
I want to create a new topic
So that I can dicuss Nick's Mom
}, :type => RailsStory do
Scenario "Successfully create a new topic in the 'General' forum" do
Given "a user named", "Jon" do |login|
@user = create_user login
end
Given "a forum named", "General" do |name|
@forum = create_forum name
end
When "creating a new topic titled", "Nicks Mom" do |title|
post_via_redirect "/forums/[EMAIL PROTECTED]/topics", :topic =>
{ :title => title }
end
Then "user should see", "topics/show" do |template|
response.should render_template(template)
end
And "page should show", "Nicks Mom" do |title|
response.should have_text(/Title: #{title}/)
end
end
end
def create_user(name)
user = User.create! :name => name
user
end
def create_forum(name)
forum = Forum.create!(
:name => name,
:description => "Everything from the latest gossip to the coolest
youtube videos.")
forum
end
You can see I did a couple things differently:
* Use the forum ID in the url
* Use post_via_redirect
* Specify the template and some text that should be shown
The first item solves the problem of the autoincrementing ID, at least
for the forum_id part of the URL.
Your story is actually a bit broken, imo. You POST the new topic and
then GET a url. But how does the user know what that URL is? More
likely you're redirecting them to the right URL. You should use
post_via_redirect because the user makes a post and then follows the
redirect.
You'll have a controller spec that specifies what the redirect url
should be. Brief example
it "should redirect to the topic's show page" do
do_post
response.should redirect_to(topic_url(@mock_topic))
end
The story allows you to specify the external behavior, which is that
the user POSTs to a url and then gets redirected to a page showing the
topic. The controller spec lets you specify the internal behavior,
which includes the correct redirect url.
hth
Pat
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users