Проблема с ошибками в главе 7 учебника Hartl - PullRequest
0 голосов
/ 17 января 2012

Когда я запускаю bundle exec rspec spec /, я получаю 21 пример и 3 ошибки. Эти сбои:

Неудачи:

1) У пользователя has_password? метод должен быть истинным, если пароли совпадают Ошибка / Ошибка: @ user.has_password? (@ Attr [: пароль]). Должно быть_тру NoMethodError: неопределенный метод has_password?' for nil:NilClass # ./spec/models/user_spec.rb:47:in блок (3 уровня) в '

2) У пользователя has_password? метод должен быть ложным, если пароли не совпадают Ошибка / Ошибка: @ user.has_password? («Неверный»). Должен быть_фальсом NoMethodError: неопределенный метод has_password?' for nil:NilClass # ./spec/models/user_spec.rb:51:in блок (3 уровня) в '

3) При проверке пароля пользователя должны приниматься действительные адреса электронной почты. Сбой / Ошибка: он "должен отклонить недействительные адреса электронной почты" сделать NoMethodError: неопределенный метод it' for #<RSpec::Core::ExampleGroup::Nested_3::Nested_3:0x00000102eb38b0> # ./spec/models/user_spec.rb:97:in блок (3 уровня) в '

Я выложу свой файл user_spec.rb до н.э. Я думаю, что это почти правильно, но не полностью. Обратите внимание на закомментированные концы, у меня были те в игре прежде, но я думал, что они были неправы, поэтому прокомментировал их

require 'spec_helper'

describe User do

  before(:each) do
    @attr = { 
      :name => "Example User", 
      :email => "user@example.com", 
      :password => "foobar", 
      :password_confirmation => "foobar" }
  end

    it "should create a new instance given valid attributes" do
    User.create!(@attr)
  end

  describe "password encryption" do

    before(:each) do
      @user = User.create!(@attr)
  end

    it "should have an encrypted password attribute" do
       @user.should respond_to(:encrypted_password)
  end

    it "should set the encrypted password" do
      @user.encrypted_password.should_not be_blank
  end
end

  describe "has_password? method" do

    it "should be true if the passwords match" do
      @user.has_password?(@attr[:password]).should be_true
  end

    it "should be false if the passwords don't match" do
      @user.has_password?("invalid").should be_false
  end
end

  describe "password validations" do

  it "should require a password" do
    User.new(@attr.merge(:password => "", :password_confirmation => "")).
      should_not be_valid
  end

  it "should require a matching password confirmation" do
    User.new(@attr.merge(:password_confirmation => "invalid")).
      should_not be_valid
  end

  it "should reject short passwords" do
    short = "a" * 5
    hash = @attr.merge(:password => short, :password_confirmation => short)
    User.new(hash).should_not be_valid
  end

  it "should reject long passwords" do
    short = "a" * 5
    hash = @attr.merge(:password => short, :password_confirmation => short)
    User.new(hash).should_not be_valid
  end

  it "should require a name" do
     no_name_user = User.new(@attr.merge(:name => ""))
     no_name_user.should_not be_valid
  end

  it "should require an email address" do
    no_email_user = User.new(@attr.merge(:email => ""))
    no_email_user.should_not be_valid
  end

  it "should accept valid email addresses" do
    addresses = %w[user@foo.com THE_USER@foo.bar.org first.last@foo.jp]
    addresses.each do |address|
      valid_email_user = User.new(@attr.merge(:email => address))
      valid_email_user.should be_valid
    end
  #end

  it "should reject invalid email addresses" do
    addresses = %w[user@foo,com user_at_foo.org example.user@foo.]
    addresses.each do |address|
      invalid_email_user = User.new(@attr.merge(:email => address))
      invalid_email_user.should_not be_valid
   end
  #end

  it "should reject duplicate email addresses" do
    # Put a user with given email address into the database.
    User.create!(@attr)
   user_with_duplicate_email = User.new(@attr)
    user_with_duplicate_email.should_not be_valid
    end

  it "should reject email addresses identical up to case" do
       upcased_email = @attr[:email].upcase
       User.create!(@attr.merge(:email => upcased_email))
       user_with_duplicate_email = User.new(@attr)
       user_with_duplicate_email.should_not be_valid
    end

  it "should reject names that are too long" do
    long_name = "a" * 51
    long_name_user = User.new(@attr.merge(:name => long_name))
    long_name_user.should_not be_valid
        end
      end
    end
  end
end

Мой файл user.rb в порядке, я думаю.

Таким образом, проблема с тремя сбоями является одним из аспектов моей проблемы, но то, что меня действительно беспокоит, это следующая команда:

комплект exec rspec spec / models / user_spec.rb -e "has_password \? Method"

Результат в терминале таков:

Не найдено ни одного примера {: full_description => / (? - mix: has_password \\? \ Method) /}.

Завершено за 0,00003 секунды. 0 примеров, 0 сбоев

Согласно Хартлу, у меня должно быть 2 примера и 0 сбоев. Идеи? Любой вклад приветствуется:)

1 Ответ

0 голосов
/ 03 февраля 2012

в вашем файле user_spec.rb.

убедитесь, что у вас есть:

       before(:each) do
         @user = User.create!(@attr)
       end

сразу после следующей строки:

     describe "has_password? method" do

он отсутствует в коде из учебника. вы увидите, что это часть блока шифрования пароля. похоже, что он заглушает пользователя для этого теста. это не очень СУХОЙ ... вероятно, способ запустить этот блок-заглушку для каждого блока описания, но это немного дальше, чем я. :) надеюсь, это поможет ... мои тесты заработали.

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