Giả sử bạn có ActiveRecord :: Observer trong một trong các ứng dụng Ruby on Rails của bạn - làm thế nào để bạn kiểm tra người quan sát này với rSpec?Làm thế nào để bạn kiểm tra các nhà quan sát với rSpec trong ứng dụng Ruby on Rails?
Trả lời
Bạn đang ở bên phải theo dõi, nhưng tôi đã gặp phải một số lỗi tin nhắn không mong muốn khi sử dụng rSpec, người quan sát và đối tượng giả. Khi tôi đang thử nghiệm mô hình của mình, tôi không muốn phải xử lý hành vi của người quan sát trong các kỳ vọng về thông điệp của mình.
Trong ví dụ của bạn, không có cách nào thực sự tốt để mô tả "set_status" trên mô hình mà không biết người quan sát sẽ làm gì với nó.
Vì vậy, tôi muốn sử dụng "No Peeping Toms" plugin. Với mã của bạn ở trên và sử dụng các plugin Không Peeping Toms, tôi sẽ spec mô hình như thế này:
describe Person do
it "should set status correctly" do
@p = Person.new(:status => "foo")
@p.set_status("bar")
@p.save
@p.status.should eql("bar")
end
end
Bạn có thể spec mã mô hình của bạn mà không cần phải lo lắng rằng có một người quan sát ở đó sẽ đi vào và che đậy giá trị của bạn. Bạn muốn spec mà riêng trong person_observer_spec như thế này:
describe PersonObserver do
it "should clobber the status field" do
@p = mock_model(Person, :status => "foo")
@obs = PersonObserver.instance
@p.should_receive(:set_status).with("aha!")
@obs.after_save
end
end
Nếu bạn REALLY REALLY muốn kiểm tra Model cùng và lớp Observer, bạn có thể làm điều đó như thế này:
describe Person do
it "should register a status change with the person observer turned on" do
Person.with_observers(:person_observer) do
lambda { @p = Person.new; @p.save }.should change(@p, :status).to("aha!)
end
end
end
99% số thời gian, tôi muốn kiểm tra spec với các nhà quan sát tắt. Nó dễ dàng hơn theo cách đó.
Disclaimer: Tôi chưa bao giờ thực sự làm điều này trên một trang web sản xuất, nhưng có vẻ như một cách hợp lý sẽ được sử dụng các đối tượng giả, should_receive
và bạn bè, và gọi các phương pháp trên quan sát trực tiếp
Do sau mô hình và quan sát:
class Person < ActiveRecord::Base
def set_status(new_status)
# do whatever
end
end
class PersonObserver < ActiveRecord::Observer
def after_save(person)
person.set_status("aha!")
end
end
tôi sẽ viết một spec như thế này (tôi chạy nó, và nó đi)
describe PersonObserver do
before :each do
@person = stub_model(Person)
@observer = PersonObserver.instance
end
it "should invoke after_save on the observed object" do
@person.should_receive(:set_status).with("aha!")
@observer.after_save(@person)
end
end
Chúng tôi đã làm theo phương pháp này và nó hoạt động tuyệt vời –
no_peeping_toms bây giờ là một viên ngọc và có thể được tìm thấy ở đây: https://github.com/patmaddox/no-peeping-toms
Kể từ Rails 3.1 có một phương pháp vô hiệu hóa cho các nhà quan sát. –
+1 no_peeping_toms –
Nếu bạn muốn kiểm tra rằng người quan sát quan sát mô hình chính xác và nhận được thông báo như mong đợi, đây là một ví dụ sử dụng RR.
your_model.rb:
class YourModel < ActiveRecord::Base
...
end
your_model_observer.rb:
class YourModelObserver < ActiveRecord::Observer
def after_create
...
end
def custom_notification
...
end
end
your_model_observer_spec.rb:
before do
@observer = YourModelObserver.instance
@model = YourModel.new
end
it "acts on the after_create notification"
mock(@observer).after_create(@model)
@model.save!
end
it "acts on the custom notification"
mock(@observer).custom_notification(@model)
@model.send(:notify, :custom_notification)
end
- 1. Các nhà quan sát đường ray - Khi nào và khi nào không sử dụng các nhà quan sát trong Rails
- 2. Sự kiện/Quan sát Điều khiển Ruby on Rails
- 3. Làm thế nào để kiểm tra Mongoid :: Observer với rspec
- 4. Rails 3: Làm thế nào để xác định hành động after_commit trong các nhà quan sát? (tạo/cập nhật/hủy)
- 5. Cách kiểm tra ứng dụng trò chuyện trong Ruby on Rails?
- 6. Kiểm tra xem nil xem trong Ruby on Rails
- 7. làm thế nào để kiểm tra i18n trong Rails với RSpec
- 8. Favicon trong Ruby on Rails ứng dụng
- 9. Làm thế nào để làm chủ Ruby on Rails
- 10. Kiểm tra tích hợp liên tục cho Ruby on Rails với Jenkins
- 11. Làm thế nào để kiểm tra ThinkingSphinx sử dụng RSpec
- 12. Làm thế nào để bạn kiểm tra các ràng buộc tuyến đường sử dụng RSpec
- 13. Kiểm tra cú pháp hoặc "Biên dịch" một ứng dụng Ruby on Rails
- 14. làm thế nào để chạy rspec mà không có người quan sát nào trong đường ray 3?
- 15. Sử dụng Ruby on Rails
- 16. Ruby on Rails Case/Switch. Làm thế nào để phù hợp với đối tượng?
- 17. Làm thế nào để bạn kiểm tra hàm băm params trong bài kiểm tra Rails?
- 18. Viết thông số cho người trợ giúp với Ruby on Rails và RSpec
- 19. Làm thế nào để bạn lặp qua các đối tượng bản ghi đang hoạt động trong Ruby On Rails?
- 20. Kiểm tra trang lỗi trong Rails với RSpec + Capybara
- 21. Ruby on rails server app + Ứng dụng khách trên iOS?
- 22. Làm thế nào để kiểm soát kích thước của hộp chọn trong Ruby on Rails 3?
- 23. Làm thế nào để thiết lập neo4j với ontop dBpedia của ứng dụng ruby-on-ray?
- 24. Kiểm tra Ruby Gems dưới Rails
- 25. Làm thế nào để bạn quan sát các hashtables JavaScript trong Knockout?
- 26. Chạy phantomj từ ứng dụng Ruby on Rails
- 27. Tích hợp Ruby on Rails Với Wordpress
- 28. Ruby on Rails Bảng đơn Thừa kế (STI) và bài kiểm tra đơn vị (với PostgreSQL)
- 29. Làm thế nào tôi có thể làm cho của Ruby on Rails của tôi 2.3.4 ứng dụng "Rails 3-ready"
- 30. Làm cách nào để kiểm tra phản hồi 204 trong RSpec trong Rails?
Nếu bạn muốn kiểm tra các nhà quan sát sau đó một mẫu tôi sử dụng là 'mô tả PersonOb server { xung quanh (: mỗi) {| spec | Person.with_observers (: person_observer) {spec.run}}} 'Điều này cho phép người quan sát cho tất cả các thử nghiệm trong PersonObserver mô tả khối. – roo
Câu trả lời này được phát âm như một câu trả lời, nhưng không rõ ràng về những gì. Nó chắc chắn không trả lời trực tiếp cho câu hỏi ... –