如何使用Ruby RSpec测试添加了观察者的类?

如何使用Ruby RSpec测试添加了观察者的类?,ruby,rspec,observer-pattern,resque,Ruby,Rspec,Observer Pattern,Resque,我的任务是这样执行的: class MyTask @queue = :queue_name include BaseTask end module BaseTask include Observable def perform add_observer(MyObserver.new) ... changed notify_observers end end 我有一个Resque任务,使用p

我的任务是这样执行的:

class MyTask
    @queue = :queue_name
    include BaseTask
end

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

我有一个Resque任务,
使用
perform
方法调用
add\u observer
changed
notify\u observer
,包括Observable
。如何使用
RSpec
测试
BaseTask
?我初始化了
MyTask
并调用了
task.perform
。我尝试了
可观察。是否应该接收(:添加观察者)
MyTask。任何实例。是否应该接收(:添加观察者)
BaseTask。是否应该接收(:添加观察者)
,但它们不工作?

您应该能够检查
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

如何测试使用
:update
调用
MyObserver
?我添加了
MyObserver.any\u实例。应该在
任务之前接收(:update)
。执行
,但它说没有调用
update
。但我知道这是因为
放入
更新中
正在执行。我更新了答案,以显示检查
MyObserver
的示例。