Почему этот тест RSpec не проходит? - PullRequest
3 голосов
/ 11 мая 2011

Я нахожусь в процессе изучения Ruby on Rails, поэтому относитесь ко мне как к неофиту, потому что я.

У меня есть модель User с некоторыми связанными тестами RSpec и следующий тесттерпит неудачу:

require 'spec_helper'
describe User do

    it 'should require a password' do
        User.new({:email => 'valid_email@example.com', :password => '', :password_confirmation => ''}).should_not be_valid
    end

end

Соответствующая часть модели User выглядит следующим образом:

class User < ActiveRecord::Base
    ...
    validates :password, :presence => true,
                         :confirmation => true,
                         :length => { :minimum => 6 }
    ...
end

Вот подвох: если я запускаю User.new(...).valid? из консоли Rails, используя аргументывыше, он возвращает false, как и ожидалось, и показывает правильные ошибки (пароль пуст).

Я использовал spork / autotest и перезапустил оба безрезультатно, но этот тест также не проходит, даже если он запускался напрямую с rspec.Что я здесь не так делаю?

РЕДАКТИРОВАТЬ

Я попробовал еще несколько вещей с тестом.Это терпит неудачу:

        u = User.new({:email => 'valid_email@example.com', :password => '', :password_confirmation => ''})
        u.should_not be_valid

Так же это:

        u = User.new({:email => 'valid_email@example.com', :password => '', :password_confirmation => ''})
        u.valid?
        u.errors.should_not be_empty

Это проходит, подтверждая, что :password действительно пуст:

        u = User.new({:email => 'valid_email@example.com', :password => '', :password_confirmation => ''})
        u.password.should == ''

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Итак, на самом деле проблема возникает из-за spork.Вы можете отключить кеширование, чтобы он не нуждался в перезапуске каждый раз:

http://ablogaboutcode.com/2011/05/09/spork-testing-tip-caching-classes

Я думаю, что так и происходит:

ruby-1.9.2-p180 :020 > u = User.new
 => #<User id: nil, email: ...
ruby-1.9.2-p180 :021 > u.errors
 => {} 
ruby-1.9.2-p180 :022 > u.save
 => false 
ruby-1.9.2-p180 :023 > u.errors
 => {:email=>["can't be blank", "can't be blank"], ...} 

Короче, если вы измените новый для создания, это будет работать :) Я думаю, что это происходит потому, что совпадение be_valid проверяет ошибки проверки модели.Может быть более глубокое объяснение, но я думаю, что если вы используете create вместо new, это будет работать.

EDIT: у меня есть версия be_valid_verbose, которая может помочь.Просто создайте файл 'be_valid_verbose.rb' в вашей папке rspec / custom_matchers и внутри него напишите:

RSpec::Matchers.define :be_valid_verbose do
  match do |model|
    model.valid?
  end

  failure_message_for_should do |model|
    "#{model.class} expected to be valid but had errors:n #{model.errors.full_messages.join("n ")}"
  end

  failure_message_for_should_not do |model|
    "#{model.class} expected to have errors, but it did not"
  end

  description do
    "be valid"
  end
end

Теперь проверьте be_valid_verbose вместо be_valid.Надеемся, он предоставит вам дополнительную информацию о том, что происходит в вашем деле.

0 голосов
/ 11 мая 2011

Как я и опасался, ответом была глупость. Это была проблема спорка. Я думал, что убил существующий процесс и выполнял rspec независимо, но позже я обнаружил, что процесс spork все еще работает в другой оболочке, и rspec подключался к нему все время. Перезапуск spork (или полное его уничтожение) и повторный запуск тестов устранили проблему.

Я нашел это особенно обманчивым в том, что rspec постоянно обновляла результаты теста, чтобы отразить тот факт, что он знал об изменениях в моем тесте, поэтому мне показалось, что он работает с обновленным кодом. Теперь мне остается только задуматься, в чем же заключается реальная полезность spork, поскольку, очевидно, я не могу поверить, что он действительно правильно запускает правильные тесты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...