2011-06-23 53 views
7

Ai đó có thể giải thích sự khác biệt giữa các phương pháp sau đây với tôi không?RSpec - sử dụng lambda

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

Đó là phương pháp hiện tại. Điều này cũng có thể đạt được với phương pháp dưới đây?

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

Chúng có giống nhau không? Hay thứ hai không hoạt động? Bởi vì hướng dẫn tôi đang theo dõi có vẻ như sử dụng response bất cứ khi nào có thể, nhưng không làm điều đó trong trường hợp trên. Ai đó có thể xin giải thích sự khác biệt giữa hai phương pháp trên, làm thế nào lambda và RSpec của phản ứng làm việc? Cảm ơn!

+0

Phương pháp lambda được nói rằng các hành động tổng thể thay đổi số lượng tài khoản bằng 1 nơi như phương pháp thứ hai được nêu rõ phản ứng thay đổi Số người dùng +1. – basicxman

Trả lời

10

Hình thức lambda là tương đương với cách này, nếu cơ sở dữ liệu thử nghiệm là rỗng:

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

Tôi tin rằng gọi change mà không cần cung cấp một khối, như bạn thấy trong ví dụ thứ hai, sẽ tạo ra một lỗi.

Biểu mẫu lambda được sử dụng để bọc một phần mã có thể được sử dụng để đặt kỳ vọng theo cách thuận tiện hơn sau đó kiểm tra với trước và sau điều kiện. Trong nhiều phiên bản gần đây của RSpec bạn cũng sẽ thấy điều này thực hiện với expect:

expect { 
    post :create, :user => @attr 
}.to change(User, :count).by(1) 
Các vấn đề liên quan