我已经使用 Rails 几年了,并且已经制作了几个可以通过的应用程序,这些应用程序正在生产中。我一直避免做任何测试,但我决定纠正它。我正在尝试为我为已经启动并运行但正在不断修订的工作编写的应用程序编写一些测试。我担心任何更改都会破坏事情,所以我想启动并运行一些测试。我已经阅读了 RSpec 书,观看了一些截屏视频,但我很难开始(这让我觉得只有在你真正完成之后才能理解)。
我正在尝试编写应该是对我的 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 集)。这种登录行为大概必须为我的几乎所有测试复制,那么我如何在我的代码中执行一次并让它在任何地方都适用?
我意识到这是一个大问题,所以我感谢您的关注。