我在尝试创建一个仅用于在我的规范套件中进行测试的类时遇到了问题。
我有一个ActiveRecord模型,Change
,属于ChangeType
。 ChangeType
本身由每种特定的更改类型(例如ChangeOfDetails
)继承。
为了测试ChangeType
的一些功能,我在我的规范套件中创建了一个新类:
class ChangeTypeExtender < ChangeType
...
end
如果我使用app中定义的扩展类,它可以正常工作:
let(:change_type) { ChangeOfDetails.first_or_create }
let(:change) { build :change, change_type: change_type }
如果在使用的spec文件中定义了伪类,它可以正常工作:
class ChangeTypeExtender < ChangeType
...
end
let(:change_type) { ChangeTypeExtender.first_or_create }
let(:change) { build :change, change_type: change_type }
但是,如果ChangeTypeExtender
在其自己的文件中定义(在本例中为spec/support/change_type_extender.rb
),并且在spec_helper
中需要:
let(:change_type) { ChangeTypeExtender.first_or_create }
let(:change) { build :change, change_type: change_type }
#=> ActiveRecord::AssociationTypeMismatch Exception: ChangeType(#111347560) expected, got ChangeTypeExtender(#116569860)
更奇怪的是,测试类肯定是从ChangeType
change_type = ChangeTypeExtender.first_or_create
change_type.method(:method_on_change_type).source_location #=> ["/.../app/models/change_type.rb", 36]
应该注意的是,当我使用FactoryGirl时,我不认为这是一个FG问题,因为以下也存在问题:
change = Change.new
change.change_type = ChangeTypeExtender.first_or_create
#=> ActiveRecord::AssociationTypeMismatch Exception: ChangeType(#111347560) expected, got ChangeTypeExtender(#116569860)
最后,我的config.cache_classes = false
确实有config/environments/test.rb
。
任何关于为什么会发生这种情况的方向将不胜感激。 感谢。
答案 0 :(得分:0)
好的,所以我仍然不确定为什么我会遇到多次定义的类,但我已经为这个问题提出了一个可接受的解决方法。
可以使用rspec
在共享上下文中定义类 shared_context :change_type_extender_class do
class ChangeTypeExtender < ChangeType
...
end
end
然后通过包含共享上下文(include_context :change_type_extender_class
)包含在您选择的规范中。
我仍然很好奇为什么我会看到这种奇怪的行为,如果有人能向我解释,我会很感激。