我在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是否适合它?
我应该摆脱测试只读模型
我通过互联网搜索,但我没有找到任何此类问题的例子。我需要在另一个数据库之上构建应用程序,但我想以某种方式测试它。 : - )
答案 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
功能。