学习RSpec的spies的使用方法

66 阅读1分钟

学习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

上述规范的意思是这样的。

  1. let!(service_double):我们创建一个MyCustomService双倍数,我们模拟subscribe ,以允许监视它,我们确保我们服务类中的new 方法总是返回这个双倍数。
  2. let!(:subscriber_double):我们在实例中创建一个double,类似于我们的MyCustomService 嘲弄,我们嘲弄MySubscriber#new ,以返回这个double。我们的想法是,我们可以确认这个订阅是用这个特定的实例调用的。
  3. 最后expect(service_double).to have_received(:subscribe).with(subscriber_double) :这就是我们测试的结尾,我们基本上是在说:我的模拟服务调用了subscribe,它实际上包括了我的模拟订阅者AKA我的创建正在订阅我的监听器

在特定的方法中强制执行某些要求,这是非常酷的事情。