【问题标题】:Rails Rspec test Slack::NotifierRails Rspec 测试 Slack::Notifier
【发布时间】:2016-09-16 10:21:10
【问题描述】:

我有自己的宝石(仅供学习)。所以,我有我的测试应用程序,它使用我的 gem。在我的应用程序中,我创建了初始化文件,用于为我的 gem 模型添加自定义回调。

类似这样的:

#my_app/confing/initializers/my_nagios.rb
MyNagios::Check.class_eval do
 after_save :send_slack_notification

 private

 def send_slack_notification
    ...
    @notifier ||= Slack::Notifier.new "..."
    ...
    @notifier.ping "..."

现在我想为这个自定义回调创建 Rspec 测试。

我尝试这样的事情:

describe MyNagios::Check do
  let(:slack_notifier)  { double(Slack::Notifier) }

  it 'should send notification' do
    ... some actions ...
    expect(slack_notifier).to receive(:ping).with('test') # 'test' just for now, it will be replaced

但我收到一个错误:

   (Double Slack::Notifier).ping("test")
       expected: 1 time with arguments: ("test")
       received: 0 times

我应该使用double 代替Slack::Notifier 吗?我的测试出了什么问题?

【问题讨论】:

    标签: ruby-on-rails callback rubygems rspec-rails


    【解决方案1】:

    几件事可能会有所帮助:

    1. 除非您在未显示的某处分配 @notifier 变量,否则不会使用您的双精度数。 config/initializers/my_nagios.rb 中的 Slack::Notifier.new 实例是接收 ping 的对象。您需要对其进行设置,以便将您的 slack_notifier double 传递给 MyNagios 实例。

    2. 需要在保存发生之前 设置预期,因此如果 ping 应该在“...某些操作...”期间发生,那么您需要移动您的期望高于这一点。

    把它们放在一起,你应该得到这样的东西:

    class MyNagios
      def initialize(slack_notifier)
        @slack_notifier = slack_notifier
        #...
      end
    end
    
    # test
    it 'should send notification' do
      #... some actions ...
      expect(slack_notifier).to receive(:ping).with('test')
      MyNagios.new(slack_notifier).save
    end
    

    希望有帮助!

    【讨论】:

    • 也就是说,您可能会发现在 gem 本身中编写这些测试要比在应用程序中使用 gem 容易得多。
    • 感谢您的帮助。好吧,不是最优雅的解决方案,而是我m use for now something like this: expect_any_instance_of(Slack::Notifier).to receive(:ping).with('...').and_return(true)`
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多