Cách nói “should_receive” nhiều lần hơn trong RSpec


112

Tôi có cái này trong bài kiểm tra của mình

Project.should_receive(:find).with(@project).and_return(@project)

nhưng khi đối tượng nhận được cuộc gọi phương thức đó hai lần, tôi phải làm

Project.should_receive(:find).with(@project).and_return(@project)
Project.should_receive(:find).with(@project).and_return(@project)

Có cách nào để nói điều gì đó như

Project.should_receive(:find).with(@project).and_return(@project).times(2)

Câu trả lời:


214

Điều này đã lỗi thời. Vui lòng kiểm tra câu trả lời của Uri bên dưới

cho 2 lần:

Project.should_receive(:find).twice.with(@project).and_return(@project)

đúng n lần:

Project.should_receive(:find).exactly(n).times.with(@project).and_return(@project)

trong ít nhất n lần:

Project.should_receive(:msg).at_least(n).times.with(@project).and_return(@project)

thêm chi tiết tại https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts trong Nhận số lượng

Hy vọng nó sẽ giúp ích =)


3
Có vẻ như có thể điều này không hoạt động với any_instance?
Jared Beck

@YoLudke Tôi không biết
Jared Beck

2
Nên sử dụng cú pháp mới được đề cập trong câu trả lời của Uri .
theblang

61

expectCú pháp mới của rspec sẽ giống như sau:

cho 2 lần:

expect(Project).to receive(:find).twice.with(@project).and_return(@project)

đúng n lần:

expect(Project).to receive(:find).exactly(n).times.with(@project).and_return(@project)

trong ít nhất n lần:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)

1
Các have_receivedcú pháp cũng làm việc. expect(Project).to have_received(:find).exactly(n).timesvv
David Tuite

0

@JaredBeck đã chỉ ra. Giải pháp không hoạt động cho tôi khi any_instancegọi.

Đối với bất kỳ trường hợp nào, tôi đã kết thúc bằng cách sử dụng sơ khai thay vì nên_receive.

Project.any_instance.stub(:some_method).and_return("value")

Điều này sẽ làm việc cho bất kỳ số không. của thời gian mặc dù.



0

should_receive, trái ngược với any_instance, kỳ vọng rằng lớp nhận được thông báo với số lần được chỉ định.

any_instance mặt khác thường được sử dụng để khai thác một phương pháp.

Vì vậy, trường hợp đầu tiên là một kỳ vọng mà chúng ta muốn kiểm tra, trong khi trường hợp thứ hai là vượt qua một phương thức để đến dòng tiếp theo để chúng ta có thể tiếp tục.


1
Drenmi Tôi đánh giá cao thời gian bạn đã bỏ ra để thêm một vài dấu phẩy vào bài đăng mà tôi đã thêm gần một năm trước ... Có vẻ như không có bất kỳ thay đổi nào đối với khía cạnh kỹ thuật của câu trả lời ... Tại sao bạn lại bỏ phiếu tôi vì cái này ...?
amnsan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.