目前使用 Pusher 和 RSpec。
Pusher.should_receive( :trigger ).with( 'message', { :data => '12345' })
这会起作用,除了电话是Pusher[ 'channel-id' ].trigger...
如何用 RSpec 模拟这个?
Well[]
是一个函数名,所以它可以被存根。在您看到的 Pusher 源代码def_delegators :default_client, :webhook, :channel, :[]
中:所以所有这些方法都被转发到default_client
. 所以这实际上是一个方法链。
我会像这样做你想做的事。
mock_client = mock('client')
Pusher.stub(:[]).with('channel-id').and_return(mock_client)
mock_client.should_receive( :trigger ).with( 'message', { :data => '12345' })
我现在手头没有 rspec,但看不出它为什么不起作用。
较新版本的 Pusher 支持更容易存根的更浅的 API:
expect(Pusher).to receive(:trigger).with("channel-id", "message", { data: "12345" })
Pusher.trigger("channel-id", "message", { data: "12345" })
还有一个pusher-fake可以为你的测试启动一个假服务器,所以你不必存根——它让你的应用程序可以通过那个假服务器发送和接收。
Michael Papile 的回答基本上是正确的。这是我使用的代码:
Pusher.stub_chain( :[] , :trigger )
Pusher[ channel_id ].should_receive( :trigger ).with( 'message', { :data => '12345' })
实际上,事实证明这段代码不起作用,因为它不匹配channel_id
。