2010-08-30 21 views
8

Tôi đã cố gắng để khai báo open, phiên bản mở-uri và tôi không thành công.RSpec làm thế nào để khai mở?

Tôi đã thử làm như sau nhưng yêu cầu giữ đi qua:

Kernel.should_receive(:open).and_return("Whatever for now") 

Tôi cũng đã cố gắng để làm

OpenURI::OpenRead.should_receive(:open).and_return("Whatever for now") 

Kể từ khi tôi theo dõi xuống mà là nơi các yêu cầu HTTP đã được thực hiện trong OpenURI.

Cảm ơn trước vì bất kỳ đề xuất nào!

Trả lời

8

Tôi đã tìm thấy giải pháp ở đây trên Stack Overflow sau một thời gian nữa trên Google (Tôi không thể tin rằng mình không tìm thấy điều này trước đây).

Giải thích lấy từ here và được viết bởi Tony Pitluga (không liên kết được).

Nếu bạn đang gọi giấc ngủ trong bối cảnh của một đối tượng, bạn nên còn sơ khai nó trên đối tượng [...]
Điều quan trọng là, để còn sơ khai ngủ trên bất cứ điều gì "tự" là trong bối cảnh nơi ngủ được gọi là.

Vì vậy, tôi đã làm điều này và tất cả làm việc ra:

let(:read) { mock('open') } 

it "should return the new log-level when the log level was set successfully" do 
    read.stub(:read).and_return('log-level set to 1') 
    kannel.should_receive(:open).and_return(read) 

    kannel.set_log_level(1).should == 1 
    end 
+0

Rất tuyệt! Tôi nghĩ rằng nó là hợp lý để chỉnh sửa này và đăng nó như là giải pháp cho 'mở()' và chấp nhận câu trả lời của riêng bạn. Có thể khó tìm thấy bài viết 'sleep()' khi đang mở '. – wuputah

+0

Điểm rất tốt để bám vào bất cứ bối cảnh nào của bản thân. Điều này đã giúp tôi giải quyết một vấn đề tương tự, cảm ơn! – stuartc

+0

Tôi đã cập nhật mã của bạn. Giải thích ở đây: http://stackoverflow.com/a/11258596/608361 – Zsolt

1

Tôi khuyên bạn nên sử dụng thứ gì đó để mở mạng thay thế. Tôi tin rằng yêu thích hiện tại để làm như vậy là FakeWeb [docs]. Bạn cũng có thể quan tâm fakeweb-matcher cho rspec.


Alas, tôi nghĩ FakeWeb có thể không làm việc với open(), trên thực tế, nó cuống Net::HTTP, vì vậy tôi không chắc chắn nếu điều đó sẽ làm việc. Bất kỳ cơ hội nào không sử dụng open()? :)

+0

' open() 'là hoàn toàn phù hợp cho nơi mã sẽ đi như vậy bằng cách sử dụng' Net: HTTP' trực tiếp sẽ chỉ cảm thấy sai. :) Tôi đã dành nhiều thời gian hơn trên Google và tìm thấy một câu hỏi Stack Overflow khác đã giúp tôi. Nhưng cảm ơn vì đã cố gắng! – gaqzi

11

Dưới đây là những gì tôi làm

class Gateway 

    def do_something 
    open('http://example.com').read 
    end 

end 

Trong spec của tôi tôi làm như sau:

describe 'communication' do 

    it 'should receive valid response from example.com' do 
    gateway = Gateway.new 
    gateway.stub_chain(:open, :read).and_return('Remote server response') 

    gateway.do_something.should == "Remote server response" 
    end 

end 
+0

Tôi nghĩ đây là một cách tuyệt vời xung quanh loại vấn đề này. Cảm ơn bạn đã nhắc tôi :) – nruth

+1

Ngoài ra, 'Gateway.any_instance.stub_chain (...)' – kgilpin

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