【问题标题】:Assert Redis publication断言 Redis 发布
【发布时间】:2015-02-22 21:47:22
【问题描述】:

我正在为 after_create 回调编写规范。规范如下所示:

it 'broadcasts creation' do
  message = Message.create(body: 'foo')
  expect(Redis.any_instance).to have_received(:publish)
end

我的Message 模型如下所示:

class Message < ActiveRecord::Base
  after_create -> { publish(:create) }

  private

  def publish(name)
    Redis.new.publish(
      self.class.inferred_channel_name,
      json(action)
    )

    Redis.new.publish(
      inferred_channel_name_for_single_record,
      json(action)
    )

    puts 'published!'
  end
end

我知道回调会运行,因为我在最后打印“已发布”,并且我已经验证 Redis 确实发布了两次。

不过,我的规范失败并显示以下消息:

1) Message Methods #entangle without options broadcasts creation
 Failure/Error: expect(Redis.any_instance).to have_received(:publish)
   unstubbed, expected exactly once, not yet invoked: #<AnyInstance:Redis>.publish(any_parameters)
 # ./spec/models/message_spec.rb:20:in `block (5 levels) in <top (required)>'

我正在使用 bourne 和 mocha 来使用 have_received 匹配器。

我怎样才能让这个测试通过?

【问题讨论】:

    标签: ruby-on-rails rspec redis publish-subscribe


    【解决方案1】:

    Redis 创建一个模拟,并存根类和实例方法——分别为newpublish

    it "broadcasts creation" do
      redis = stub_redis
    
      Message.create(body: "foo")
    
      expect(redis).to have_received(:publish).twice
    end
    
    def stub_redis
      mock("redis").tap do |redis|
        redis.stubs(:publish)
        Redis.stubs(:new).returns(redis)
      end
    end
    

    【讨论】:

    • 我注意到有一个 mock_redis gem 让这项工作变得微不足道。
    【解决方案2】:

    您可以尝试使用 expect_any_instance_of 模拟。

    it 'broadcasts creation' do
      expect(Redis.any_instance).to receive(:publish).twice
      message = Message.create(body: 'foo')
    end
    

    https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/working-with-legacy-code/any-instance

    【讨论】:

    • 看来这实际上不允许我使用have_received,只能使用should_receive...还是我做错了什么?
    • 我发布的代码未经测试,所以不,您可能没有做错任何事情。尝试先设置期望的编辑版本,然后运行代码来练习它。
    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多