Chris Olsen
2008-Jan-28 19:36 UTC
[rspec-users] Could this controller test be made simpler?
In a create controller method I am testing the else clause that occurs when the model is unable to be saved. Sounds simple enough, but because model is created before the save and the form has to be re-filled I now have to stub a model and all the attributes. Since the error messages are displayed I also have to stub some methods within the model that allow the error messages to be displayed properly. This small test turns into a lot of code. So I am wondering if there is something that I am missing to make this much simpler. Things did start simple, in the stubbing of the new method within the Account class and then the save method within the @account model. Then I get errors reminding me to stub out the users method for the account model, then the build method, etc I have looked at the generated scaffold code and it is simpler, but it seems that the relationship made between the two models is what starts to make this more complex. Thanks for the help. Here is my current code: ============== before :each do @account = mock_model(Account) #what is being tested here @account.stub!(:save).and_return(false) #User info @user = mock_model(User) users = mock("Userlist") @account.stub!(:users).and_return(users) users.stub!(:build).and_return(@user) #since the form is repopulated the account mock must have stub for all the attributes @account.stub!(:subdomain).and_return("") @account.stub!(:company_name).and_return("") @account.stub!(:filename).and_return("") @user.stub!(:login).and_return("") @user.stub!(:email).and_return("") @user.stub!(:password).and_return("") @user.stub!(:password_confirmation).and_return("") #need these to satisfy the error messages errors = mock("errors") errors.stub!("empty?").and_return(false) errors.stub!("full_messages").and_return(["error 1", "error 2"]) @account.stub!(:errors).and_return(errors) @user.stub!(:errors).and_return(errors) Account.stub!(:new).and_return(@account) end it "should re-render new template" do post "create" #with no submitted params response.should render_template("accounts/new") end # Controller code def create @account = Account.new(params[:account]) @user = @account.users.build(params[:user]) if verify_recaptcha(@account) && @account.save redirect_to admin_listings_url else render :action => "new" end end -- Posted via http://www.ruby-forum.com/.
Andrew WC Brown
2008-Jan-28 19:45 UTC
[rspec-users] Could this controller test be made simpler?
Been a month since I''ve rspec, I think you can place the stubs here. @user = mock_model(User, login => "", email => "", password => "", password_confirmation => "" ) @account = mock_model(Account, subdomain => "", company_name => "", filename => "" ) On Jan 28, 2008 2:36 PM, Chris Olsen <lists at ruby-forum.com> wrote:> In a create controller method I am testing the else clause that occurs > when the model is unable to be saved. Sounds simple enough, but because > model is created before the save and the form has to be re-filled I now > have to stub a model and all the attributes. Since the error messages > are displayed I also have to stub some methods within the model that > allow the error messages to be displayed properly. > > This small test turns into a lot of code. So I am wondering if there is > something that I am missing to make this much simpler. Things did start > simple, in the stubbing of the new method within the Account class and > then the save method within the @account model. Then I get errors > reminding me to stub out the users method for the account model, then > the build method, etc > > I have looked at the generated scaffold code and it is simpler, but it > seems that the relationship made between the two models is what starts > to make this more complex. > > Thanks for the help. > > Here is my current code: > ==============> before :each do > @account = mock_model(Account) > > #what is being tested here > @account.stub!(:save).and_return(false) > > #User info > @user = mock_model(User) > users = mock("Userlist") > @account.stub!(:users).and_return(users) > users.stub!(:build).and_return(@user) > > #since the form is repopulated the account mock must have stub for > all the attributes > @account.stub!(:subdomain).and_return("") > @account.stub!(:company_name).and_return("") > @account.stub!(:filename).and_return("") > @user.stub!(:login).and_return("") > @user.stub!(:email).and_return("") > @user.stub!(:password).and_return("") > @user.stub!(:password_confirmation).and_return("") > > #need these to satisfy the error messages > errors = mock("errors") > errors.stub!("empty?").and_return(false) > errors.stub!("full_messages").and_return(["error 1", "error 2"]) > @account.stub!(:errors).and_return(errors) > @user.stub!(:errors).and_return(errors) > > Account.stub!(:new).and_return(@account) > end > > it "should re-render new template" do > post "create" #with no submitted params > response.should render_template("accounts/new") > end > > # Controller code > def create > @account = Account.new(params[:account]) > @user = @account.users.build(params[:user]) > > if verify_recaptcha(@account) && @account.save > redirect_to admin_listings_url > else > render :action => "new" > end > end > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >-------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/rspec-users/attachments/20080128/ccfb1a56/attachment-0001.html