我已经在Rails上玩了几年了,并且已经开发出了几款在生产中还可以使用的应用程序.我一直避免做任何测试,但我已经决定纠正这一点.我正在try 为一个应用程序编写一些测试,这个应用程序是我为已经启动并运行但正在不断修改的工作编写的.我担心任何改变都会 destruct 一切,所以我想启动并运行一些测试.我读过RSpec的书,看了几段视频,但我很难开始(我觉得这是一种只有真正做到了才能理解的事情).
我正在try 写一个简单的测试我的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在这里有什么意义(我甚至应该使用它)?我如何在测试环境中创建这个假用户?我的认证系统是一个非常简单的brew 系统(基于Railscasts episode 250).这种登录行为可能必须在我的几乎所有测试中复制,那么我该如何在代码中执行一次并让它应用到所有地方呢?
我意识到这是一个大问题,所以我感谢你的关注.