我有一个请求规范,试图在我的Rails 3.1中测试文件下载功能。规范(部分)如下所示:
get document_path(Document.first)
logger(response.body)
response.should be_success
失败了:
Failure/Error: response.should be_success
expected success? to return true, got false
但如果我在浏览器中测试下载,它会正确下载文件。
以下是控制器中的操作:
def show
send_file @document.file.path, :filename => @document.file_file_name,
:content_type => @document.file_content_type
end
我的记录器提供了有关响应的信息:
<html><body>You are being <a href="http://www.example.com/">redirected</a>.</body></html>
如何让这个测试通过?
更新
正如几位指出的那样,我的一个before_filters正在进行重定向。原因是我使用Capybara登录测试,但没有使用它的方法来浏览网站。这是有效的(部分):
click_link 'Libraries'
click_link 'Drawings'
click_link 'GS2 Drawing'
page.response.should be_success #this still fails
但现在我无法找到一种方法来测试实际的响应是否成功。我在这里做错了什么。
答案 0 :(得分:1)
最有可能的是,在运行测试时会调用redirect_to
。以下是我要做的事情来确定原因。
这将告诉您重定向之前执行的程度。这反过来会告诉你什么代码块(可能是before_filter
)重定向。
如果我不得不从头脑中猜测,我会说你有before_filter
来检查用户是否已登录。如果这是真的,那么你需要确保在调用受登录保护的操作之前,测试会创建一个登录会话。
答案 1 :(得分:0)
我得到了相同的重定向,直到我意识到我的登录(用户)方法是罪魁祸首。从this SO link开始,我将登录方法更改为:
# file: spec/authentication_helpers.rb
module AuthenticationHelpers
def login(user)
post_via_redirect user_session_path, 'user[email]' => user.email, 'user[password]' => user.password
end
end
在我的测试中:
# spec/requests/my_model_spec.rb
require 'spec_helper'
require 'authentication_helpers'
describe MyModel do
include AuthenticationHelpers
before(:each) do
@user = User.create!(:email => 'user@email.com', :password => 'password', :password_confirmation => 'password')
login(@user)
end
it 'should run your integration tests' do
# your code here
end
end
[FWIW:我正在使用Rails 3.0,Devise,CanCan和Webrat]