我有Profile
型号:
class Profile < ActiveRecord::Base
belongs_to :user
def fields_needed_for_completion
[self.name, self.city]
end
def completed?
!fields_needed_for_completion.any? { |f| f.nil? || f == "" }
end
end
我正在尝试确定如何为具有belongs_to
关联的模型编写单元测试。特别是我不确定如何正确设置测试数据。
到目前为止,我已整理了以下内容:
describe Profile do
subject(:profile) { FactoryGirl.create(:profile) }
describe "fields_needed_for_completion" do
context "with all fields missing" do
it "returns all fields as nil" do
expect(profile.fields_needed_for_completion.all? &:blank?).to be true
end
end
end
describe "#completed?" do
#TO DO
end
end
两个问题:
使用FactoryGirl创建Profile对象而不是直接调用Profile.create
这样可以吗?工厂现在没有设置任何属性(即工厂定义如下:factory :profile do; end
)
如您所见,这些规范中根本没有使用User
模型。是否适合像这样单独测试模型,即使在实践中它将属于用户?或者我应该以某种方式嘲笑用户?
答案 0 :(得分:0)
以下是我的看法:
是的,事实上很好 - 您完全按照预期使用FactoryGirl
。通过工厂创建测试对象(而不是显式调用Model.create
)允许您在多个测试之间重用创建逻辑,并将所有创建相关逻辑放在一个位置。
这意味着,例如,如果您要向模型中添加新的强制(一个带有验证)列,那么您将不得不仅调整该模型的工厂,而不是在整个过程中修复多个Model.create
次出现试验。
你的第二个问题是方法论问题,而不是技术问题,因此对于这种问题更加开放,但这是我的两分钱:
我认为有必要单独测试Profile
模型并与User
相关联。可以单独测试非用户相关逻辑,并且可以在该上下文中测试用户相关逻辑。
请注意FactoryGirl
允许您通过在User
工厂中定义Profile
association来轻松设置此上下文。