2014-08-29 22 views
1

我有AR模型关注Uuidable,看起来像这样:Rspec在describe_class或DummyClass中测试AR模型问题?

module Uuidable 
    extend ActiveSupport::Concern 

    included do 
    before_create :generate_uuid 
    end 

    protected 

    def generate_uuid 
    self.uuid = #some code 
    end 

end 

到目前为止,我已经写了shared_examples_for Uuidable,看起来像这样:

shared_examples_for Uuidable do 

    let(:model) { FactoryGirl.build(described_class) } 

    it { expect(model).to callback(:generate_uuid).before(:create) } 

    describe '#generate_uuid' do 

    it { expect{model.save}.to change {model.uuid} } 

    it 'should not generate same uuid' do 
     allow(SecureRandom).to receive(:uuid).and_return("c640f32c-e21b-44ea-913e-7041fdb6de85", "c640f32c-e21b-44ea-913e-7041fdb6de85", "e93f0130-3a81-406f-8871-609d89ae0850") 
     model.save 
     expect(FactoryGirl.create(described_class).uuid).not_to eq(model.uuid) 
    end 

    context 'generated uuid field' do 
     before(:each) { model.save } 
     it { expect(model.uuid).to be_kind_of(String) } 
     it { expect(model.uuid).to match(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i)} 
    end 

    end 

end 

所以...我想知道是在每个Uuidable模型中测试#generate_uuid方法的行为是否正确?

我在想是内 class DummyClass < ActiveRecord::Base创建测试 Uuidable关注和 shared_examples

第二个选项,你认为什么只留下it { expect(model).to callback(:generate_uuid).before(:create) } ?什么是最好的方法?

回答

1

我更喜欢第一个选项。假设你的另一个模型有一些验证,before_save或before_create回调不能保存数据到表的情况?

通过使用shared_examples_for您可以轻松地分发所需的片规格的用于在这种模型类中使用Uuidable关注进行测试。另一方面,如果您使用第二种方法,它将仅限于一个模型:DummyClass,并且可能每次都传递其规格,而不管使用Uuidable模块的模型中的验证或其他回调失败。

你的做法是正确的。只需在模型的规格中使用it_behaves_like "Uuidable"即可,这些规格使用了这个问题并让它们独立运行。