我试图编写一个应该很简单的关于我的ReportsController的测试。我的应用程序的问题在于几乎整个应用程序都在认证层之后。如果未登录,则什么都不起作用,因此我必须模拟登录才能发送一个简单的get请求(虽然我想我应该编写一些测试来确保没有登录什么都不起作用-我稍后会处理这个问题)。
我使用RSpec、Capybara、FactoryGirl和Guard建立了一个测试环境(不确定要使用哪些工具,所以使用了Railscasts的建议)。到目前为止,我编写测试的方法是像这样在FactoryGirl中创建一个用户:
FactoryGirl.define do
sequence(:email) {|n| "user#{n}@example.com"}
sequence(:login) {|n| "user#{n}"}
factory :user do
email {FactoryGirl.generate :email}
login {FactoryGirl.generate :login}
password "abc"
admin false
first_name "Bob"
last_name "Bobson"
end
end
然后像这样编写我的测试:
require 'spec_helper'
describe ReportsController do
describe "GET 'index'" do
it "should be successful" do
user = Factory(:user)
visit login_path
fill_in "login", :with => user.login
fill_in "password", :with => user.password
click_button "Log in"
get 'index'
response.should be_success
end
end
end
这样会失败:
1) ReportsController GET 'index' should be successful
Failure/Error: response.should be_success
expected success? to return true, got false
# ./spec/controllers/reports_controller_spec.rb:13:in `block (3 levels) in <top (required)>'
有趣的是,如果我将测试代码改为response.should be_redirect
,测试就会通过,这表明在此之前一切都正常工作,但登录未被识别。
所以我的问题是,我需要做什么才能使此登录功能正常工作?我需要在数据库中创建与 FactoryGirl 凭证匹配的用户吗?如果是这样,那么 FactoryGirl 的作用是什么(我是否应该使用它)?我该如何在测试环境中创建这个虚拟用户?我的身份验证系统是一个非常简单的自制系统(基于 Railscasts 第 250 集)。几乎所有的测试都需要进行登录操作,那么我该怎样在我的代码中只进行一次登录,并使其适用于所有测试?
我知道这是一个大问题,感谢您审查。
request.session [:user]
更改为request.session [:user_id]
,但除此之外,您代码中的所有内容都适用于我,现在我有了我的第一个通过测试!谢谢。 - brad