Учебное пособие по Ruby On Rails 3, глава 8: модульные тесты не пройдены - PullRequest
0 голосов
/ 08 октября 2011

Я работаю над книгой Хартла и дошел до главы 8. Я написал несколько тестов, которые, по моему мнению, должны пройти. Я четыре раза проверил свой код на соответствие тому, что в книге, и дважды проверил его на то, что в репозитории github книги , но я в тупике. Я получаю следующие ошибки от RSpec:

Failures:

  1) UsersController POST 'create' should redirect to the user "show" page
     Failure/Error: response.should redirect_to(user_path(assigns(:user)))
     ActionController::RoutingError:
       No route matches {:action=>"show", :controller=>"users", :id=>#<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, encrypted_password: nil, salt: nil>}
     # ./spec/controllers/users_controller_spec.rb:93:in `block (3 levels) in <top (required)>'

  2) UsersController POST 'create' should have a welcome message
     Failure/Error: flash[:success].should =~ /welcome to the sample app/i
       expected: /welcome to the sample app/i
            got: nil (using =~)
     # ./spec/controllers/users_controller_spec.rb:98:in `block (3 levels) in <top (required)>'

Finished in 0.83875 seconds
46 examples, 2 failures

Как я уже сказал, я проверял код снова и снова. Перезапустил spork, перезапустил сервер rails, запустил без spork. Я проверил это по коду в книге и в репозитории github. Я даже скопировал / вставил спецификации и код контроллера в репозиторий github, но все безрезультатно.

Я в тупике. Уже поздно и мне нужно разбиться. :)

Надеюсь, один из вас, ребята, сможет увидеть то, что я не такой. Вот что у меня так далеко ...

users_controller_spec.rb

require 'spec_helper'

describe UsersController do
  render_views

  # ...

  describe "POST 'create'" do

    # ...

    describe 'success' do
      before(:each) do
        @attr = { :name => 'New User', :email => 'some-email@gmail.com', :password => 'foobar', :password_confirmation => 'foobar' }
      end

      it 'should create a new user' do
        lambda do
          post :create, :user => @attr
        end.should change(User, :count).by(1)
      end
    end

    it 'should redirect to the user "show" page' do
      post :create, :user => @attr
      response.should redirect_to(user_path(assigns(:user)))
    end

    it 'should have a welcome message' do
      post :create, :user => @attr
      flash[:success].should =~ /welcome to the sample app/i
    end

  end
end

users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
    @title = 'Sign up'
  end

  def show
    @user = User.find params[:id]
    @title = @user.name
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      flash[:success] = 'Welcome to the Sample App!'
      redirect_to @user
    else
      @title = 'Sign up'
      render 'new'
    end
  end
end

user.rb

class User < ActiveRecord::Base
  # Virtual properties (don't exist in db)
  attr_accessor :password

  # Accessible properties
  attr_accessible :name, :email, :password, :password_confirmation
  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name,  :presence => true,
                    :length => { :maximum => 50 }

  validates :email, :presence => true,
                    :format => { :with => email_regex },
                    :uniqueness => { :case_sensitive => false }

  validates :password,  :presence => true,
                        :confirmation => true,
                        :length => { :within => 6..40 }

  before_save :encrypt_password

  # Return true if the user's password matches the submitted password
  def has_password?(submitted_password)
    # Compare encrypted_password with the encrypted version of submitted_password
    encrypted_password == encrypt(submitted_password)
  end

  # Static/Class methods
  def self.authenticate(email, submitted_password)
    user = find_by_email email
    return nil if user.nil?
    return user if user.has_password? submitted_password
  end

  # Private functionality.
  # Anything after the 'private' pragma will be inaccessable from outside the class
  private

    def encrypt_password
      self.salt = make_salt if new_record? # Using ActiveRecord goodness to make sure this only gets created once.
      self.encrypted_password = encrypt(password)
    end

    def encrypt(string)
      secure_hash("#{salt}--#{string}")
    end

    def make_salt
      secure_hash("#{Time.now.utc}--#{password}")
    end

    def secure_hash(string)
      Digest::SHA2.hexdigest(string)
    end
end

routes.rb

SampleApp::Application.routes.draw do
  #get '/users/new'
  resources :users

  match '/signup' => 'users#new'

  match '/about' => 'pages#about'
  match '/contact' => 'pages#contact'
  match '/help' => 'pages#help'

  root :to => 'pages#home'
end

Заранее спасибо. Если вы, ребята, действительно хотите покопаться или я что-то пропустил в своем посте, вот мой код .

Я очень новичок в рельсах, и до сих пор его очень люблю. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

your it "должно перенаправить на страницу показа пользователя", а it "должно иметь приветственное сообщение"

находится вне описания цикла "success" do

1 голос
/ 08 октября 2011

Посмотрите внимательно на свою users_controller_spec спецификацию "успеха": когда она создаст @attr? Перед каждым тестом или непосредственно перед тестом «должен создать нового пользователя»? Вы используете во всех тестах "POST 'create'" ...

Как только вы сделаете это неспецифичным, ваши тесты пройдут.

(Кстати, иметь код в git удобно, но только если код, который вы публикуете, действительно проверен, в противном случае ... не так много;)

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