我正在尝试为 sti 子类上的方法构建一个 rspec 测试,该测试只读取父模型的方法。 该方法在应用程序中有效,只是在 rspec 测试中不起作用。 我不知道我错过了什么
模型/动物/动物.rb
class Animal < ActiveRecord::Base
def favorite
"unicorn"
end
end
模型/动物/mammal_animal.rb
class MammalAnimal < Animal
def favorite
"whale"
end
end
模型/动物/cat_mammal_animal.rb
class CatMammalAnimal < MammalAnimal
def favorite
"tabby"
end
end
mammal_animal_spec.rb
require 'rails_helper'
RSpec.describe MammalAnimal, type: :model do
let(:cat_mammal_animal) {FactoryGirl.create(:cat_factory)}
subject(:model) { cat_mammal_animal }
let(:described_class){"MammalAnimal"}
describe "a Cat" do
it "should initialize successfully as an instance of the described class" do
expect(subject).to be_a_kind_of described_class
end
it "should have attribute type" do
expect(subject).to have_attribute :type
end
it "has a valid factory" do
expect(cat_mammal_animal).to be_valid
end
describe ".favorite " do
it 'shows the favorite Cat' do
expect(cat_mammal_animal.type).to eq("CatMammalAnimal")
expect(cat_mammal_animal.favorite).to include("tabby")
expect(cat_mammal_animal.favorite).not_to include("whale")
expect(cat_mammal_animal.favorite).not_to include("unicorn")
print cat_mammal_animal.favorite
end
end
end
end
错误
Failures:
1) MammalAnimal.favorite and .favorite shows the favorite Cat
Failure/Error: expect(cat_mammal_animal.type).to include("tabby")
expected "unicorn" to include "tabby"
# ./spec/models/mammal_animal_spec.rb:82:in `block (3 levels) in <top (required)>'
更新
动物.rb
FactoryGirl.define do
factory :animal do
type 'Animal'
name "dragon"
trait :mammal do
type 'MammalAnimal'
name "zebra"
end
trait :cat do
type 'CatMammalAnimal'
name "calico"
end
factory :mammal_factory, traits: [:mammal]
factory :cat_factory, traits: [:cat]
end
end
根据建议,我将以下行添加到测试中
expect(cat_mammal_animal.class.constantize).to eq(CatMammalAnimal)
并得到此错误
1)哺乳动物动物最爱和最爱显示最喜欢的猫 失败/错误: 期望(cat_animal_mammal.class.constantize).to eq(CatMammalAnimal)
NoMethodError:
undefined method `constantize' for #<Class:0x007f8ed4b8b0e0>
Did you mean? constants
我认为与其使用 trait
来创建子类的对象,不如为这些对象设置单独的工厂。
factory :animal do
name 'dragon'
end
factory :mammal, class: MammalAnimal do
name 'zebra'
end
factory :cat, class: CatMammalAnimal do
name 'calico'
end
所有这些都可以在animals.rb
中定义
然后,您可以创建诸如
create(:animal)
create(:mammal)
create(:cat)