在嵌套上下文中使用`let`和`create`时如何不重复编写相同的属性?

时间:2017-11-18 13:19:24

标签: ruby-on-rails rspec factory-bot

我使用FactoryBot(FactoryGirl)进行Rspec测试,如下所示:

describe Note do
  let(:note) {create(:note, title: "my test title", body: "this is the body")}

  expect(note.title).to eq "my test title"
  expect(note.body).to eq "this is the body"

  context "with many authors" do
    let(:note) {create(:note, :many_authors, title: "my test title", body: "this is the body")}
    it "has same title and body and many authors"  do
      expect(note.title).to eq "my test title"
      expect(note.body).to eq "this is the body"
      expect(note.authors.size).to eq 3 
    end
  end
end

在这个测试中,我有标题和正文的初始:note。在嵌套上下文中,我想使用相同的note,但只需添加我的:many_authors特征。但是,我发现自己必须复制并粘贴前一个注释中的属性title: "my test title", body: "this is the body",所以我想知道干掉代码的最佳方法是什么,所以我不必总是复制并粘贴标题和身体属性。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

简单,只需再提取一个let

describe Note do
  let(:note_creation_params) { title: "my test title", body: "this is the body" }
  let(:note) { create(:note, note_creation_params) }

  context "with many authors" do
    let(:note) { create(:note, :many_authors, note_creation_params) }
  end
end

但可能在这种情况下,在工厂设置属性是一个更好的选择。

答案 1 :(得分:0)

尝试提供note_factory默认值

# spec/factories/note_factory.rb
FactoryGirl.define do    
  factory :note do
    title "my test title"
    body "this is the body"
  end
end

并创建?

# spec/models/note_spec.rb
describe Note do
  let(:note) { create(:note) }
  ...

  context "with many authors" do
    let(:note) { create(:note, :many_authors) }
    ...
  end
end