hãy để nó hoạt động như một bản chất của nó. Cũng lưu trữ nó.
Một gotcha tôi tìm thấy ngay lập tức với let ... Trong một khối Spec đang đánh giá một sự thay đổi.
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
Bạn sẽ cần chắc chắn gọi let
bên ngoài khối mong đợi của bạn. tức là bạn đang gọi FactoryGirl.create
trong khối cho phép của bạn. Tôi thường làm điều này bằng cách xác minh đối tượng được duy trì.
object.persisted?.should eq true
Mặt khác, khi let
khối được gọi lần đầu tiên, một sự thay đổi trong cơ sở dữ liệu sẽ thực sự xảy ra do việc khởi tạo lười biếng.
Cập nhật
Chỉ cần thêm một ghi chú. Hãy cẩn thận khi chơi golf code hoặc trong trường hợp này rspec golf với câu trả lời này.
Trong trường hợp này, tôi chỉ cần gọi một số phương thức mà đối tượng đáp ứng. Vì vậy, tôi gọi _.persisted?
phương thức _ trên đối tượng là sự thật của nó. Tất cả những gì tôi đang cố gắng làm là khởi tạo đối tượng. Bạn có thể gọi trống không? hay không quá. Vấn đề không phải là thử nghiệm mà là mang lại sự sống cho đối tượng bằng cách gọi nó.
Vì vậy, bạn không thể tái cấu trúc
object.persisted?.should eq true
được
object.should be_persisted
vì đối tượng chưa được khởi tạo ... sự lười biếng của nó. :)
Cập nhật 2
tận dụng sự cho phép! cú pháp để tạo đối tượng ngay lập tức, nên tránh vấn đề này hoàn toàn. Lưu ý mặc dù nó sẽ đánh bại rất nhiều mục đích của sự lười biếng của không đập.
Ngoài ra, trong một số trường hợp, bạn thực sự có thể muốn tận dụng cú pháp chủ đề thay vì cho phép vì nó có thể cung cấp cho bạn các tùy chọn bổ sung.
subject(:object) {FactoryGirl.create :object}