如何使用Rails,Paperclip和RSpec请求规范测试文件下载?

时间:2012-01-05 17:52:50

标签: ruby-on-rails rspec rspec-rails

我有一个请求规范,试图在我的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

但现在我无法找到一种方法来测试实际的响应是否成功。我在这里做错了什么。

2 个答案:

答案 0 :(得分:1)

最有可能的是,在运行测试时会调用redirect_to。以下是我要做的事情来确定原因。

  1. 将日志记录添加到可能针对此操作运行的任何过滤器之前。
  2. 在操作本身的多个点添加日志记录。
  3. 这将告诉您重定向之前执行的程度。这反过来会告诉你什么代码块(可能是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]