使用Rspec测试Rails belongs_to模型

时间:2016-02-08 07:04:54

标签: ruby-on-rails unit-testing model-view-controller rspec

我有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

两个问题:

  1. 使用FactoryGirl创建Profile对象而不是直接调用Profile.create这样可以吗?工厂现在没有设置任何属性(即工厂定义如下:factory :profile do; end

  2. 如您所见,这些规范中根本没有使用User模型。是否适合像这样单独测试模型,即使在实践中它将属于用户?或者我应该以某种方式嘲笑用户?

1 个答案:

答案 0 :(得分:0)

以下是我的看法:

  1. 是的,事实上很好 - 您完全按照预期使用FactoryGirl。通过工厂创建测试对象(而不是显式调用Model.create)允许您在多个测试之间重用创建逻辑,并将所有创建相关逻辑放在一个位置。 这意味着,例如,如果您要向模型中添加新的强制(一个带有验证)列,那么您将不得不仅调整该模型的工厂,而不是在整个过程中修复多个Model.create次出现试验。

  2. 你的第二个问题是方法论问题,而不是技术问题,因此对于这种问题更加开放,但这是我的两分钱: 我认为有必要单独测试Profile模型并与User相关联。可以单独测试非用户相关逻辑,并且可以在该上下文中测试用户相关逻辑。 请注意FactoryGirl允许您通过在User工厂中定义Profile association来轻松设置此上下文。