FactoryGirl 不在数据库中保存对象

FactoryGirl doesn't save objects in DB

我在 spec/requests 中有这样的代码:

      describe "with valid data" do
        let(:player) { FactoryGirl.create :player }
        let(:player2) { FactoryGirl.create :player2 } 

        @player = Player.new(firstname: "Tom", lastname: "Greg", nickname: "jimi21")
        @player.save

        @players = Player.all
        p @players.count
      end

控制台中的输出是:

1

为什么这段代码不在测试数据库中创建对象?我的意思是这一行:

let(:player) { FactoryGirl.create :player }

我想根据保存在数据库中的玩家编写更多测试。 我如何使用 RSpec 和 FactoryGirl 巧妙地做到这一点?

来自 FactoryGirl 文件的代码:

FactoryGirl.define do
  factory :player do
    firstname "John"
    lastname "Smith"
    nickname "smithy99"
    avatar { File.new(Rails.root.join('spec/images/1.png')) }
  end

  factory :player2 do
    firstname "Tom"
    lastname "Marlow"
    nickname "marlowy11"
    avatar { File.new(Rails.root.join('spec/images/1.png')) }
  end
end

您的代码中实际上没有任何测试,并且您从不引用您在其中设置的变量,因此您的 let 块永远不会 运行。

RSpec 中的测试包含在 it 块中,例如

it "tests something" do
  # This is a test! player will be defined here!
end

如果你像这样设置一个测试,并在其中引用 playerplayer2,它们将被定义。

如果您不想手动引用它们来定义它们,您可能想要急于加载它们,使用let!而不是[=12] =].

要获得我认为您想要的完整代码片段:

  describe "with valid data" do
    let!(:player) { FactoryGirl.create :player }
    let!(:player2) { FactoryGirl.create :player2 } 

    it "doesn't allow duplicate names" do
      @player = Player.new(firstname: "Tom", lastname: "Greg", nickname: "jimi21")
      @player.save

      @players = Player.all
      p @players.count
    end
  end