2011-09-28 29 views
13

Tôi có một bài kiểm tra như thế:Khẳng định mong đợi nhiều sự thay đổi trong một lambda yêu cầu duy nhất

lambda { post("/api/users", parameters) }.should change(User,:count).by(1) 
lambda { post("/api/users", parameters) }.should_not change(ActionMailer::Base, :deliveries) 

Nhưng tôi muốn làm điều đó như thế:

lambda { post("/api/users", parameters) }.should change(User,:count).by(1).and_not change(ActionMailer::Base, :deliveries) 

Có thể làm điều đó mà không có sự cần hai cuộc gọi sau?

Cảm ơn

+0

đang tìm kiếm chính mình này – prusswan

Trả lời

11

Tôi đã tìm thấy giải pháp để kiểm tra.

lambda{ 
    lambda { post("/api/users", params) }.should change(User,:count).by(1) 
}.should change(ActionMailer::Base.deliveries, :count).by(1) 
2

Trong các bài kiểm tra của tôi Tôi rất nghiêm ngặt: Tôi muốn mỗi bài kiểm tra chỉ kiểm tra một điều. Vì vậy, tôi sẽ luôn luôn chọn hình thức đầu tiên, không phải là thứ hai.

Thứ hai tôi không chắc chắn về mặt kỹ thuật có thể. Các .should hy vọng một khối, được thực hiện trước và sau lambda. Dù sao, để kiến ​​thức của tôi hiện tại rspec không hỗ trợ này (và imho với lý do chính đáng).

+0

Ok, cảm ơn bạn đã trả lời! –

0

Gần đây tôi tình cờ gặp vấn đề này khi di chuyển một số request kiểm tra sang định dạng thử nghiệm feature cho Capybara 2.1, và chuyển đổi cú pháp thử nghiệm có từ should dựa trên để expect dựa trên. Để sử dụng các câu hỏi ban đầu như ví dụ này, tôi đã mã như:

subject { -> { post("/api/users", parameters) } } 
it { should change(User,:count).by(1) } 
it { should_not change(ActionMailer::Base, :deliveries) } 

Đưa này qua expect cú pháp trong một thử nghiệm scenario trình bày một số vấn đề và mang lại loại clunkiness (làm việc) (xin lỗi, không phải là một fan hâm mộ lớn lồng nhau một cách rõ ràng lambda s/expect s):

expect(-> { expect(post("/api/users", parameters)).to change(User,:count).by(1) } 
).to_not change(ActionMailer::Base, :deliveries) 

có một số giải pháp tuyệt vời cho vấn đề này trong this StackOverflow thread mà tôi đã cố gắng và thành công với, nhưng những gì tôi đã kết thúc làm được chỉ cần làm theo các định dạng ban đầu hơi và tách ra mỗi tuyên bố vào riêng của mình scenario; một cái gì đó như:

feature "Add users via API" do 
    given(:posting_parameters_to_api) { -> { post("/api/users", parameters) } } 

    scenario "foo" do 
    expect(posting_parameters_to_api).to change(User,:count).by(1) 
    end 

    scenario "bar" do 
    expect(posting_parameters_to_api).to_not change(ActionMailer::Base, 
                :deliveries) 
    end 
end 

Chi tiết hơn so với thông số gốc request, nhưng về cơ bản hoạt động theo cùng một cách. Việc triển khai có thể sẽ giảm xuống theo sở thích cá nhân.

Các vấn đề liên quan