我试图通过研究railscasts和stackoverflow帖子将他的示例升级到Rails 3.1时试图通过Hartl's Ruby on Rails tutorial,因为我喜欢用艰难的方式学习东西。我的版本包含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
注意:我意识到我不是在这里坚持干,不幸的是我不知道如何将参数传递给sign_in方法:(
sessions_helper.rb sign_in方法
def sign_in(user)
cookies[:remember_token] = user.remember_token
current_user = user
@current_user = user
end
如果我没弄错的话,这就是涉及这个'bug'的所有代码。显然我可以发布更多代码,但这可能无济于事。如果这个假设是错误的,请告诉我,我会发布任何必要的内容。
答案 0 :(得分:1)
想出如何做到这一点。由于控制器不同,这些测试需要转换为集成测试。
有关集成测试的密集概述,请参阅以下链接:
http://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec http://api.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html