当我运行以下命令rspec spec/models/vote_spec.rb
时,出现以下错误:
Failures:
1) Vote validations value validation only allows -1 or 1 as values
Failure/Error: expect ( @post.votes ).to eq(-1)
NoMethodError:
undefined method `votes' for nil:NilClass
# ./spec/models/vote_spec.rb:7:in `block (4 levels) in <top (required)>'
Finished in 0.00255 seconds (files took 2.37 seconds to load)
1 example, 1 failure
这是vote_spec.rb
require 'rails_helper'
describe Vote do
describe "validations" do
describe "value validation" do
it "only allows -1 or 1 as values" do
expect ( @post.votes ).to eq(-1)
expect ( @post.votes ).to eq(1)
end
end
end
end
对不起我是新手,我想我的@post变量没有被设置。我应该在哪里寻找这个?
答案 0 :(得分:3)
正确。由于您的@post
变量为零,因此您遇到此错误。你是什么意思&#34;我应该在哪里寻找这个?&#34;
为了解决此错误,您需要在规范中以某种方式定义@post
,高于两个&#34;示例&#34;在it
块中。 (这可以放在it
块中,也可以放在describe
上方的let
或it
块中。两种选择。创建长格式对象:
@post = Post.create(attribute_hash_here)
或使用某种工厂(以下示例使用FactoryGirl):
@post = create(:post)
但是,按照目前的情况,如果你这样做,你的规范仍然会失败,因为它有着截然不同的期望:
expect ( @post.votes ).to eq(-1)
expect ( @post.votes ).to eq(1)
除非votes
上的Post
方法都返回值并且更改了该值,否则@post.votes
将等于-1
或1
。因此,如果它通过第一个期望,它将失败第二个,如果它通过第二个,它将失败第一个。
** 编辑 ** - 正如ChrisBarthol所指出的那样,为什么你根本不需要存在@post
。如果您只是测试vote
的属性验证,为什么不单独测试该对象?
答案 1 :(得分:2)
首先这些是模型验证,并且您要验证投票模型而不是帖子模型,因此您应该设置@vote,而不是@post。其次你的测试表明你期望值等于-1然后1.它怎么可能同时?你在哪里设定价值,你期望它?您必须重新构建测试,因此您一次只测试一个项目。
require 'rails_helper'
describe Vote do
let(:post) { Post.new(whatever post params) }
before { @vote=post.votes.build(whatever vote parameters you have) }
subject { @vote }
describe "validations" do
describe "+1 value valdiation" do
before { @vote.value = 1 }
it { should be_valid }
end
describe "-1 value valdiation" do
before { @vote.value = -1 }
it { should be_valid }
end
describe "other value valdiation" do
before { @vote.value = 0 }
it { should_not be_valid }
end
end
end
我猜你的关系。还有更好的方法来编写这些测试,但这应该会引导你走上正确的道路。