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 适合它吗?
我应该摆脱测试只读模型吗
我通过互联网搜索,但我没有找到任何此类问题的例子。我需要在另一个数据库之上构建应用程序,但我希望以某种方式对其进行测试。:-)
(对于未来的搜索者:))
您应该将skip_create只读模型添加到您的工厂。这可以避免创建数据库记录,并且应该可以解决此问题。如果您想为未连接到数据库的类创建工厂(不从`ActiveRecord::Base 继承),它也很有用。
| 归档时间: |
|
| 查看次数: |
1318 次 |
| 最近记录: |