【问题标题】:RSpec test creation, Hartl's tutorial => RoR 3.1. CH10: Calling test_sign_in or post :create, :session => @attr from users_controller_specRSpec 测试创建,Hartl 的教程 => RoR 3.1。 CH10:从 users_controller_spec 调用 test_sign_in 或 post :create, :session => @attr
【发布时间】:2011-12-14 12:15:45
【问题描述】:

我正在尝试浏览 Hartl's Ruby on Rails tutorial,同时通过学习 railscasts 和 stackoverflow 帖子将他的示例升级到 Rails 3.1,因为我喜欢以艰苦的方式学习东西。我的版本包括has_secure_password

不幸的是,我遇到了一个障碍。由于某种原因,我不能打电话给test_sign_in (@user) 来自users_controller_spec.rb。我可以通过作弊和使用post :create, :user => @attr让测试通过,因为这个方法也会调用sign_in。此外,我相当肯定这主要是与 RSpec 相关的问题,因为在浏览器中尝试场景时,所有失败的测试实际上都有效。

测试似乎确实调用了post :create, :session => @attr,但未能真正登录。我认为这可能与我的工厂有关;但我不认为这有什么问题。在尝试了几个小时后,我放弃了希望并转向你们。如果您能帮助我,那就太好了!

users_controller_spec.rb 中的测试失败

describe "PUT 'update'" do

    before(:each) do
      @user = Factory(:user)
       @attr = { :email => @user.email, :password => @user.password }
       post :create, :session => @attr
      #sign_in(@user)
    end

    describe "failure" do

      before(:each) do
        @attr = { :email => "", :name => "", :password => "",
                  :password_confirmation => "" }
      end

      it "should render the 'edit' page" do
       put :update, :id => @user, :user => @attr
       response.should render_template('edit')
      end

sessions_controller.rb 创建方法

class SessionsController < ApplicationController

  def create
      user = User.find_by_email(params[:session][:email]) 
      if user && user.authenticate(params[:session][:password])
        if params[:remember_me]  
          sign_in_permanent (user)
        else
          sign_in (user)
        end
          redirect_to user, :notice => "Logged in!"
      else
          flash.now[:error] = "Invalid email or password"
          @title = "Sign in"
          render 'new'
        end
    end

注意:我意识到我在这里没有坚持 DRY,不幸的是我还不知道如何将参数传递给 sign_in 方法:(

sessions_helper.rb 登录方法

def sign_in(user)
    cookies[:remember_token] = user.remember_token
    current_user = user
    @current_user = user
end

如果我没记错的话,这就是这个“错误”所涉及的所有代码。显然我可以发布更多代码,但这可能无济于事。如果这个假设是错误的,请告诉我,我会发布任何必要的内容。

【问题讨论】:

  • 嗨@gagootch,通常建议您提交对您自己的问题的回答,详细说明您所做的事情,而不是将其添加为评论。
  • @Stedy,我知道,但是当我最终弄清楚时我还不能这样做,因为 SO 不允许我在八小时过去之前回答我自己的问题。我已删除评论并回答了我自己的问题。

标签: ruby rspec ruby-on-rails-3.1 rspec-rails railstutorial.org


【解决方案1】:

想出了如何做到这一点。由于不同的控制器,这些测试需要转换为集成测试。

有关集成测试的详细概述,请参阅以下链接:

http://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spechttp://api.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多