Rspec测试只读模型

时间:2017-08-15 08:29:32

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

我在rails 5中有一个小的应用程序。我尝试使用Rspec进行测试但是使用readonly模型失败了。

我只读模型产品和普通型号ProductMsp。第二个是与Product关联的所有价格的列表,存储在Rails DB中。 Product是与另一个数据库的外部只读连接,用于提取产品列表。

我添加了与spec / factories / product_msps.rb的产品的关联。

FactoryGirl.define do
  factory :product_msp do
    product_id 11
    initial_date '01-01-2017'
    expiry_date '31-01-2017'
    msp 9999.99
    association :product
  end
end

我没有添加任何新测试。当我再次运行rspec时,我得到了失败。可能rspec想要创建产品,但不能因为readonly数据库表。

Failures:
    1) ProductMsp Validations initial_date cannot by empty
    Failure/Error: pm = FactoryGirl.build(:product_msp, initial_date: nil)    
        ActiveRecord::ReadOnlyRecord:
            Product is marked as readonly
                 # ./spec/models/product_msp_spec.rb:17:in `block (3 levels) in <top (required)>'

以下是失败的测试:(还有更多失败)

require 'rails_helper'

RSpec.describe ProductMsp, type: :model do
    it 'initial_date cannot by empty' do
      pm = FactoryGirl.build(:product_msp, initial_date: nil)
      pm.valid?
      expect(pm.errors[:initial_date]).to include("can't be blank")
    end
end

规格/工厂/ products.rb

FactoryGirl.define do
  factory :product do
    id 11
    name 'Porsche Cayenne'
  end
end

和app / model / product.rb

class Product < ApplicationRecord
  self.primary_key = 'tw_Id'

  def readonly?
    true
  end

  has_many :product_msps

  default_scope {where(product_type:1).order(:name)}

主要问题是:如何处理测试和只读模型?

  • rspec是否适合它?

  • 我应该摆脱测试只读模型

我通过互联网搜索,但我没有找到任何此类问题的例子。我需要在另一个数据库之上构建应用程序,但我想以某种方式测试它。 : - )

2 个答案:

答案 0 :(得分:2)

(对于未来的搜索者:))

您应该将skip_create添加到工厂以获取只读模型。这允许避免创建数据库记录,并应解决此问题。如果要为类创建一个未连接到数据库的工厂(不从`ActiveRecord :: Base继承),它也很有用。

答案 1 :(得分:1)

您应该根据FactoryGirl(现在为FactoryBot)documentation使用skip_create禁用持久性:

factory :product do
  skip_create
end

您还可以根据linting documentation运行FactoryGirl.lint。如果你的一个工厂退货:

* product - Product is marked as readonly (ActiveRecord::ReadOnlyRecord)

然后你知道你应该使用skip_create功能。