0

试图习惯 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
4

1 回答 1

0

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

这意味着即使只是在您的测试中调用permission(而不是permission.save)也足以获得您想要的行为。或者,您可以使用subject!,根据文档,它“就像subject,只是块是由隐式 before 挂钩调用的。”</p>

请注意,它let的行为方式相同,并且具有let!.

于 2013-08-30T03:05:48.290 回答