2014-09-16 3 views
1

Когда я запускаю следующую команду rspec spec/models/vote_spec.rb, я получаю следующее сообщение об ошибке:Rspec недостаточность - проверка

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 не устанавливается. Где я должен искать это?

ответ

3

Исправить. Вы столкнулись с этой ошибкой, потому что переменная @post равна нулю. Что вы подразумеваете под «где я должен искать это?»

Чтобы исправить эту ошибку, вам необходимо определить @post как-то в вашей спецификации, над двумя «примерами» в вашем блоке 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. Поэтому, если он пройдет первое ожидание, он выйдет из строя вторым, и если он пройдет второй, он не будет первым.

** EDIT ** - Как ChrisBarthol отметил, что не ясно, почему вам нужно @post существовать вообще. Если вы просто проверяете проверку атрибутов vote, почему бы просто не протестировать этот объект самостоятельно?

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 

Я угадываю ваши отношения. Есть также лучшие способы написать эти тесты, но это должно привести вас к правильной дороге.

Смежные вопросы