2009-10-16 23 views
8

Tôi đã có mã này:RSpec Mocks: mock/mang lại khối từ một phương pháp gọi

Net::SSH.start(@server, @username, :password => @password) do |ssh| 
      output = ssh.exec!(@command) 
      @logger.info 'SSH output: ' 
      @logger.info output 
     end 

tôi có thể thử các SSH.Start sử dụng khuôn khổ giả RSpec của như thế này, nói với tôi rằng tôi đã đã bắt đầu phiên SSH:

Net::SSH.should_receive(:start).with("server", "user", :password => "secret") do 
      @started = true 
     end 

điều này cho tôi biết có hay không @started phiên ssh. bây giờ tôi cần phải thử ssh.exec! phương pháp, đủ dễ dàng:

Net::SSH.should_receive(:exec!).with("command")...

nhưng làm cách nào để gọi/gọi khối có chứa ssh.exec! gọi phương thức, vì tôi đã chế nhạo phương thức SSH.start? có lẽ một số phương pháp đơn giản tôi có thể gọi để thực hiện khối này, nhưng tôi không biết nó là gì và không thể tìm thấy bất kỳ giải thích thực sự tốt/tài liệu về khuôn khổ mocking của rspec.

Trả lời

19
Net::SSH.should_receive(:start).with(
    "server", "user", :password => "secret").and_yield(
    "whatever value the block should yield") 

Không chắc chắn lý do bạn cần đặt @started, vì should_receive xác minh rằng phương thức đã được gọi.

+0

không biết về should_receive ... có tài liệu nào tốt về nội dung này không? google-fu của tôi cũng thất bại cho tôi ... cũng vậy - điều gì sẽ xảy ra nếu tôi không quan tâm đến giá trị trả lại của khối bị chặn? Tôi chỉ muốn nó được thực hiện, để tôi có thể gọi should_receive trên ssh.exec! phương pháp. –

+0

Đó là những gì 'should_receive' có nghĩa là: nếu nó không được nhận, kiểm tra sẽ thất bại. Theo như tài liệu, Sách RSpec thật tuyệt vời. Tôi khuyên bạn nên sử dụng cả RSpec và tìm hiểu về BDD nói chung. – Avdi

+0

Ồ, và bạn có thể gọi '#and_yield()' mà không có đối số. – Avdi

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