【问题标题】:How to mock Pusher with RSpec in Ruby?如何在 Ruby 中使用 RSpec 模拟 Pusher?
【发布时间】:2013-04-13 11:47:21
【问题描述】:

目前正在使用 Pusher 和 RSpec。

Pusher.should_receive( :trigger ).with( 'message', { :data => '12345' })

这会起作用,除了电话是Pusher[ 'channel-id' ].trigger...

如何用 RSpec 模拟这个?

【问题讨论】:

    标签: ruby rspec mocking pusher


    【解决方案1】:

    [] 是一个函数名,所以它可以被存根。在 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,但看不出它为什么不起作用。

    【讨论】:

      【解决方案2】:

      Michael Papile 的回答基本上是正确的。这是我使用的代码:

      Pusher.stub_chain( :[] , :trigger )
      Pusher[ channel_id ].should_receive( :trigger ).with( 'message',  { :data => '12345' })
      

      实际上,这个代码不起作用,因为它与channel_id不匹配。

      【讨论】:

        【解决方案3】:

        较新版本的 Pusher 支持更易于存根的更浅的 API:

        expect(Pusher).to receive(:trigger).with("channel-id", "message", { data: "12345" })
        
        Pusher.trigger("channel-id", "message", { data: "12345" })
        

        【讨论】:

          【解决方案4】:

          还有pusher-fake 为您的测试启动一个假服务器,因此您不必存根——它允许您的应用通过该假服务器发送和接收。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-07
            • 1970-01-01
            • 2012-01-05
            • 2023-03-26
            • 2020-08-31
            • 2022-11-01
            相关资源
            最近更新 更多