Rspec在describe_class或DummyClass中测试AR模型的关注?

时间:2014-08-29 06:16:59

标签: ruby-on-rails ruby ruby-on-rails-4 rspec

我有AR模型关注的Uuidable看起来像这样:

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

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

我想到的第二个选项是在Uuidable内创建测试class DummyClass < ActiveRecord::Base,而shared_examples只留下it { expect(model).to callback(:generate_uuid).before(:create) } 你怎么看 ?什么是最好的方法?

1 个答案:

答案 0 :(得分:1)

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

通过使用shared_examples_for,您可以轻松地分发所需的规范,以便针对此类模型类中使用的Uuidable关注进行测试。

另一方面,如果您使用第二种方法,它将仅限于一个模型:DummyClass,并且可能每次都传递其规范,无论使用{{1的模型中的验证或其他回调失败模块。

你的方法是正确的。只需在使用此问题的模型规范中使用Uuidable,并让它们单独运行。