2011-09-02 21 views
5

tôi có mã trong mô hình của tôi (ROR 3.0.x) mà là nhiều hơn hoặc ít hơn như thế này:Testing móc after_create với rspec

class Message 

    after_create :notify 

    protected 

    def notify 
     if visible? 
      Notifier.message_from_portfolio(user, self).deliver 
     else 
      Notifier.invisible_message_from_portfolio(user, self).deliver 
     end 
    end 

end 

Và Tôi đang sử dụng đá quý rspec mới nhất để kiểm tra nó. Vấn đề là tôi không thể kiểm tra phương thức thông báo: nếu tôi kiểm tra trực tiếp tôi không thể vì nó được bảo vệ, nếu tôi tạo thông báo và đặt kỳ vọng nó không hoạt động vì rõ ràng mặc dù rspec chạy thông báo metod Tôi không thể bắt kịp các cuộc gọi.

đặc tả của tôi là:

describe :notification do 
    it "should send the whole message by email when visible" do 
     u = Factory.create(:user, :account_type => 1) 
     message = u.messages.build(:body => "Whatever", :author => "Nobody", :email => "[email protected]") 
     Notifier.should_receive(:message_from_portfolio) 
     message.save 
    end 
end 

Đối tượng Notifier không bao giờ nhận được message_from_portfolio. Tôi đang làm gì sai? Gợi ý?

Trả lời

3

Factory.create đã lưu thông, vì vậy nó không được tạo ra, chỉ cần lưu. Thay thế nó bằng Factory.build và tất cả sẽ ổn thôi.

+0

Nhưng 'u.messages.build' đã được sử dụng. Đó không phải là những gì bạn đề nghị? – lulalala

0

Bạn có chắc chắn đã nhận được cuộc gọi lại không? after_create không được thực thi nếu phiên bản không hợp lệ.

Bạn có thể thiết lập một kỳ vọng cho mục đích gỡ lỗi:

message.should_receive(:after_create) 

Hoặc có thể visible? lợi nhuận sai? Để kiểm tra mà bạn có thể sử dụng một kỳ vọng tiêu cực:

Notifier.should_not_receive(:invisible_message_from_portfolio) 
Các vấn đề liên quan