Ruby on rails Rspec&;工厂女孩';除非保存父项,否则无法调用create';

Ruby on rails Rspec&;工厂女孩';除非保存父项,否则无法调用create';,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我相信我的问题很容易解决。然而,我找不到如何或在哪里解决它。目前,我正在尝试在我的用户模型上测试#follow方法。以下是我的测试: describe "#follow & #following?" do before(:each) do @other_user = FactoryGirl.create(:user) end it "returns false for user following other_user" do expect(@user.followi

我相信我的问题很容易解决。然而,我找不到如何或在哪里解决它。目前,我正在尝试在我的用户模型上测试
#follow
方法。以下是我的测试:

describe "#follow & #following?" do
 before(:each) do
   @other_user = FactoryGirl.create(:user)
 end

 it "returns false for user following other_user" do
   expect(@user.following?(@other_user)).to eq(false)
 end

 it "returns true for user following other_user" do
   @user.follow(@other_user)
   expect(@user.following?(@other_user)).to eq(true)
 end
end
以下是
#follow
方法:

def follow(other_user)
 active_relationships.create(followed_id: other_user.id)
end
返回的错误是
除非保存父级,否则无法调用create
。显然,这里讨论的家长是
@other\u user
。现在第一个测试按预期通过了,因为我们显然没有运行一个调用create的方法,就像我们运行
#follow
方法一样。我的问题是如何保存此
@其他用户
,以便创建一个
活动关系

以下是
@user
的演示方式:

before { @user = FactoryGirl.build(:user) }
subject { @user }

另外,
@user
正在处理所有其他测试。当在两个
@user
@other\u user
上运行
.persistend?
时,我收到
true

正如@spickermann所指出的那样。实际的家长是
@user
,而不是
@other\u user
。因为我只是
构建
用户,所以它返回了一个未保存的对象。因此,不允许我们在尚未保存的对象上创建
活动\u关系。将
build
更改为
create
已解决此问题


正如@Spickermann所指出的,感谢Spickermann和Ben Y的参与。实际的家长是
@user
,而不是
@other\u user
。因为我只是
构建
用户,所以它返回了一个未保存的对象。因此,不允许我们在尚未保存的对象上创建
活动\u关系。将
build
更改为
create
已解决此问题


感谢Spickermann和Ben Y的参与

您的
@user
没有保存,因为
Factory.build(:user)
返回未保存的记录。在运行特定示例之前,只需更改规格以保存
@user

我会这样写规格:

subject(:user) { FactoryGirl.build(:user) }

describe "#follow & #following?" do
  let(:other) { FactoryGirl.create(:user) }

  it "returns false for user following other_user" do
    expect(user.following?(other)).to be_false
  end

  context "when following" do
    before do
      user.save
      user.follow(other)
    end

    it "returns true for user following other_user" do
      expect(user.following?(other)).to be_true
    end
  end
end

您的
@user
不会被保存,因为
Factory.build(:user)
返回未保存的记录。在运行特定示例之前,只需更改规格以保存
@user

我会这样写规格:

subject(:user) { FactoryGirl.build(:user) }

describe "#follow & #following?" do
  let(:other) { FactoryGirl.create(:user) }

  it "returns false for user following other_user" do
    expect(user.following?(other)).to be_false
  end

  context "when following" do
    before do
      user.save
      user.follow(other)
    end

    it "returns true for user following other_user" do
      expect(user.following?(other)).to be_true
    end
  end
end

在spec文件中,
@user
在何处以及如何创建?是否确实是未保存的
@other_user
?我的猜测是,
@user
未保存。对它们两个调用
persistend?
,以测试这一点。此外,您可能希望对这两个错误调用
errors
,可能工厂没有返回有效实例。
FactoryGirl.build(:user)
返回未保存的用户,我怀疑
@user.persistend?
是否返回
true
。。。请将
@user.save
添加到
@user.follow(@other\u user)
之前,并测试您的示例是否通过…@spickermann所以我测试了
@other\u user.persistend?
,然后将其更改为
@user
,或者我是这么想的。我再次运行了
@user.persistend?
,正如斯皮克曼指出的,构建返回false。实际上,创建它将使其持久化,从而保存父对象,即
@user
。。。你一直都是对的!谢谢你的帮助。如果有更好的方法,我洗耳恭听。在spec文件中,
@user
是在哪里创建的,是如何创建的?是否真的是未保存的
@其他用户
?我的猜测是,
@user
未保存。对它们两个调用
persistend?
,以测试这一点。此外,您可能希望对这两个错误调用
errors
,可能工厂没有返回有效实例。
FactoryGirl.build(:user)
返回未保存的用户,我怀疑
@user.persistend?
是否返回
true
。。。请将
@user.save
添加到
@user.follow(@other\u user)
之前,并测试您的示例是否通过…@spickermann所以我测试了
@other\u user.persistend?
,然后将其更改为
@user
,或者我是这么想的。我再次运行了
@user.persistend?
,正如斯皮克曼指出的,构建返回false。实际上,创建它将使其持久化,从而保存父对象,即
@user
。。。你一直都是对的!谢谢你的帮助。如果有更好的办法,我洗耳恭听。