【问题标题】:How can I use Ruby RSpec to test a class that adds an observer?如何使用 Ruby RSpec 测试添加观察者的类?
【发布时间】:2013-11-05 00:52:49
【问题描述】:

我的任务是这样实现的:

class MyTask
    @queue = :queue_name
    include BaseTask
end

module BaseTask
    include Observable
    def perform
        add_observer(MyObserver.new)
        ...
        changed
        notify_observers
    end
end

我有一个 Resque 任务 include Observable 使用 perform 方法调用 add_observerchangednotify_observers。如何使用RSpec 测试BaseTask?我初始化了MyTask 并调用了task.perform。我试过Observable.should_receive(:add_observer)MyTask.any_instance.should_receive(:add_observer)BaseTask.should_receive(:add_observer),但它们不起作用?

【问题讨论】:

    标签: ruby rspec observer-pattern resque


    【解决方案1】:

    您应该能够在MyTask实例 上检查消息预期。 例如,

    it "is observable" do
      task = MyTask.new
      task.should_receive :add_observer
      task.should_receive :changed
      task.should_receive :notify_observers
    
      task.perform
    end
    

    理想情况下,我不会这样做,因为正在对被测对象进行大量消息期望。相反,我可能会检查调用 perform 后的一些外部状态。

    编辑 如果你想检查MyObserver 上的实例方法,你可以在调用perform 之前做这样的事情:

    observer = mock
    MyObserver.stub(:new).and_return(observer)
    observer.should_receive(:some_method) #replace `some_method` with whatever instance method you want
    

    【讨论】:

    • 我如何测试MyObserver 是用:update 调用的?我在task.perform 之前添加了MyObserver.any_instance.should_receive(:update),但它说update 没有被调用。但我知道这是因为update 内部的puts 正在执行。
    • 我更新了我的答案以显示检查MyObserver 的示例。
    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 2012-02-10
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多