Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RSpec -- lambda usage

Can someone please explain the difference between the following methods to me?

it "should create a user" do
    lambda do
        post :create, :user => @attr
    end.should change(User, :count).by(1)
end

That is the method as it currently stands. Could this also be achieved with the method below?

it "should create a user" do
    post :create, :user => @attr
    response.should change(User, :count).by(1)
end

Are these effectively the same? Or does the second not work? Because the tutorial I'm following seems to use response whenever possible, yet did not do it in the above case. Can someone please explain the difference between the two above methods, how lambda and RSpec's response work? Thanks!

like image 434
Kvass Avatar asked Jun 23 '11 15:06

Kvass


1 Answers

The lambda form is equivalent to doing this, if the test database is empty:

User.count.should == 0
post :create, :user => @attr
User.count.should == 1

I believe that calling change without supplying a block, as you show in the second example, will generate an error.

The lambda form is used to wrap a section of code which can be used for setting an expectation in a more convenient way then testing with before and after conditions. In more recent versions of RSpec you'll also see this done with expect:

expect {
  post :create, :user => @attr
}.to change(User, :count).by(1)
like image 103
zetetic Avatar answered Oct 28 '22 12:10

zetetic