在 Dashing 中测试工作

Testing a job in Dashing

我现在正在使用 Dashing/Smashing 构建一个应用程序,我正在使用 rspec 来测试我的代码。但是,我不知道如何检查 send_event 是否被调用。我试过了

expect(Sinatra::Application).to receive(:send_event).twice

expect(Dashing).to receive(:send_event).twice,

但都没有用。我不确定哪个对象应该接收对 send_event 的调用,因为它位于 app.rb 中的 Dashing 中。还有this issue,也在讨论同样的事情,在DashingGitHub上没有回答。

任何有关如何执行此操作的建议将不胜感激。谢谢!

更新:

我仍然不知道该怎么做,但我发现这行得通:

let(:dummy_class) { Class.new { include Dashing } }

context 'something' do
    it 'does something' do
        expect(dummy_class).to receive(:send_event).once
        dummy_class.send('send_event', 'test', current: 'test')
    end
end

但是,如果我使用我想调用的包含 send_event 的方法而不是 dummy_class.send(...),那么它不会识别调用了该方法。这一定与我的测试没有使用虚拟 class 有关。我不知道是否有任何方法可以解决这个问题并让它使用虚拟 class.

我想通了!

不要在作业中直接调用 send_event。在其他 class 中调用它,也许称为 EventSender。然后,为了测试 send_event 是否被调用,将其视为 class 的实例方法而不是模块的方法。您的代码可能如下所示,例如:

describe 'something' do
    context 'something' do
        it 'does something' do
            happy_es = EventSender.new(...)
            expect(happy_es).to receive(:send_event).with(...)
            happy_es.method_that_calls_sendevent
        end
    end
end

希望这对正在为同样的事情苦苦挣扎的人有所帮助。 :)