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
。。。你一直都是对的!谢谢你的帮助。如果有更好的办法,我洗耳恭听。