Rspec 测试只读模型

rpe*_*ski 2 rspec ruby-on-rails rspec-rails ruby-on-rails-5

我在 rails 5 中有一个小应用程序。我尝试使用 Rspec 来测试它,但使用只读模型失败了。

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

我将与产品的关联添加到 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
Run Code Online (Sandbox Code Playgroud)

我没有添加任何新的测试。当我再次运行 rspec 时,我遇到了失败。可能 rspec 想要创建产品,但由于只读数据库表而无法创建。

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)>'
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

规格/工厂/产品.rb

FactoryGirl.define do
  factory :product do
    id 11
    name 'Porsche Cayenne'
  end
end
Run Code Online (Sandbox Code Playgroud)

和 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)}
Run Code Online (Sandbox Code Playgroud)

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

  • rspec 适合它吗?

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

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

Ngo*_*ral 5

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

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