控制器规范未记录我的工厂创建的用户登录信息

4

我在我的课程控制器的控制器测试中遇到了问题。似乎devise没有正确地登录我的用户。所有为该控制器生成的控制器测试都失败了。

我使用Factory-girl在users.rb中创建我的用户,如下所示...

FactoryGirl.define do
  factory :user do 
    sequence :email do |n| 
      "test#{n}@email.com"
    end
    password "password"
    password_confirmation "password"
  end
end

然后在我的courses_controller_spec.rb文件中,我按照以下方式模拟登录..

require 'spec_helper'
describe CoursesController do
  include Devise::TestHelpers

  before(:each) do
    #@request.env["devise.mapping"] = Devise.mappings[:user]
    user = Factory.create(:user)
    user.toggle!(:admin)
    sign_in user
  end

  describe "DELETE destroy" do
    it "redirects to the courses list" do
      course = Factory.create(:course)
      delete :destroy, {:id => course.to_param}, valid_session
      response.should redirect_to(courses_url)
    end
  end

我得到了输出...

Failure/Error: response.should redirect_to(courses_url)
Expected response to be a redirect to <http://test.host/courses> but was a redirect to <http://test.host/users/sign_in>

请注意,在我的spec_helper.rb文件中也使用了以下内容。
config.include Devise::TestHelpers, :type => :controller

我已经按照这里的说明进行了尝试。在我的请求规范中,我可以使用以下方法创建用户并登录,这个方法很有效,但我也想让所有的控制器测试都能正常运行。
fill_in "Email", :with => user.email
fill_in "Password", :with => user.password
click_button "Sign in"

任何帮助都将不胜感激。
1个回答

6
我刚刚自己弄明白了这个问题。在删除调用中删除 valid_session。这似乎会覆盖使用 devise 测试助手定义的会话。
其他所有内容都是正确的。保留所有的 devise 设置代码,只需更改规范中的删除行:
delete :destroy, {:id => course.to_param}

我还保留了在我的before(:each)块中的以下行,你已经注释掉了它。我还不确定它是做什么用的。
@request.env["devise.mapping"] = Devise.mappings[:user]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接