学习RSpec的spies的使用方法
May 12, 2015
RSpec的spies是一个很酷的东西,用于测试在调用某些方法后收到的消息。比如说,确保我们实现了Wisper的服务总是订阅某些监听器。
另外,如果你不熟悉Wisper,一定要看看它,它是实现发布-订阅功能的一种很酷的方式,真的很棒。
总之,让我们假设我们想测试控制器中的创建方法,其实现是这样的。
def create
service = MyCustomService.new(params)
service.subscribe(MySubscriber.new)
# I do whatever I have to do in after this
end
在创建中,我们要确保我们的服务总是订阅MySubscriber 。我们如何测试呢?
describe 'Service is subscribing to' do
context 'MySubscriber' do
let!(:service_double) {
service_double = double('service')
allow(service_double).to receive(:subscribe)
allow(MyCustomService.new).to receive(:new).and_return(service_double)
service_double
}
let!(:subscriber_double) {
subscriber_double = instance_double(MySubscriber)
allow(MySubscriber).to receive(:new).and_return(subscriber_double)
subscriber_double
}
it 'on create' do
my_model = FactoryGirl.build(:my_model)
post :create, model: my_model.attributes
expect(service_double).to have_received(:subscribe).with(subscriber_double)
end
end
end
上述规范的意思是这样的。
let!(service_double):我们创建一个MyCustomService的双倍数,我们模拟subscribe,以允许监视它,我们确保我们服务类中的new方法总是返回这个双倍数。let!(:subscriber_double):我们在实例中创建一个double,类似于我们的MyCustomService嘲弄,我们嘲弄MySubscriber#new,以返回这个double。我们的想法是,我们可以确认这个订阅是用这个特定的实例调用的。- 最后
expect(service_double).to have_received(:subscribe).with(subscriber_double):这就是我们测试的结尾,我们基本上是在说:我的模拟服务调用了subscribe,它实际上包括了我的模拟订阅者AKA我的创建正在订阅我的监听器。
在特定的方法中强制执行某些要求,这是非常酷的事情。