Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rspec在描述的_类或Dummy类中测试AR模型问题?_Ruby On Rails_Ruby_Ruby On Rails 4_Rspec - Fatal编程技术网

Ruby on rails Rspec在描述的_类或Dummy类中测试AR模型问题?

Ruby on rails Rspec在描述的_类或Dummy类中测试AR模型问题?,ruby-on-rails,ruby,ruby-on-rails-4,rspec,Ruby On Rails,Ruby,Ruby On Rails 4,Rspec,我有一个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 do let(:model) { FactoryGi

我有一个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 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编写了
共享示例,如下所示:

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 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
模型中测试
生成uuid
方法行为是否合适

我考虑的第二个选择是在
类DummyClass
中创建测试
Uuidable
关注点,并为
共享示例创建
只保留
it{expect(model).回调(:generate_uid).在(:create)}

你怎么认为?最好的方法是什么?

我更喜欢第一种方法。假设您的另一个模型在保存之前,或者在创建不允许将数据保存到表中的回调之前,有一些验证

通过使用共享的\u示例\u,您可以很容易地分发所需的规格,以便对此类模型类中使用的
Uuidable
问题进行测试

另一方面,如果使用第二种方法,它将仅限于一个模型:
DummyClass
,并且可能每次都通过其规范,而不管使用
Uuidable
模块的模型中的验证或其他回调失败

你的方法是正确的。只需使用
,它的行为就像模型规范中的“Uuidable”
,使用这个关注点,并让它们独立运行