Rspec失败 - 验证

时间:2014-09-16 14:52:20

标签: ruby-on-rails rspec

当我运行以下命令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变量没有被设置。我应该在哪里寻找这个?

2 个答案:

答案 0 :(得分:3)

正确。由于您的@post变量为零,因此您遇到此错误。你是什​​么意思&#34;我应该在哪里寻找这个?&#34;

为了解决此错误,您需要在规范中以某种方式定义@post,高于两个&#34;示例&#34;在it块中。 (这可以放在it块中,也可以放在describe上方的letit块中。两种选择。创建长格式对象:

@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将等于-11。因此,如果它通过第一个期望,它将失败第二个,如果它通过第二个,它将失败第一个。

** 编辑 ** - 正如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

我猜你的关系。还有更好的方法来编写这些测试,但这应该会引导你走上正确的道路。