使用带有let和subject语法的rspec时需要调用save

时间:2013-08-30 02:59:34

标签: ruby-on-rails rspec

尝试习惯rspec let / subject语法,我无法弄清楚。 我有这个规范:

describe Permission do
  subject(:permission){FactoryGirl.create(:permission, role: role, branch: branch, user: user)}
  let(:role){FactoryGirl.create(:role, name: 'master')}
  let(:branch){FactoryGirl.create(:branch)}
  let(:user){FactoryGirl.create(:user)}

  context "role_names_by_user_and_branch" do
    it "should return role names for the given user / branch pair" do
      # permission.save
      Permission.role_names_by_user_and_branch(user, branch).should include(role.name)
    end
  end

end

注意注释掉permission.save。如果我在测试通过中添加它。 这是我不理解的部分。如果我正在FactoryGirl.create获得该许可 应该已经保存,查询工作。

我的工厂非常基础:

FactoryGirl.define do
  factory :permission do
    user
    branch
    role
  end
end

1 个答案:

答案 0 :(得分:0)

这是因为subject是延迟加载的,所以除非你在测试中引用它,否则不会评估该块。

这意味着即使只是在测试中调用permission(而不是permission.save)也足以获得所需的行为。或者,您可以使用subject!,根据文档,它“就像subject一样,除了隐式前挂钩调用块。”

请注意let的行为方式相同,同样let!