2

我正在开发 Rails 4 应用程序,我想为 BrainTree 编写一些测试:

在 Rails 4.0.0 中使用 rspec-rails (2.14.0) 和 capybara (2.1.0)

问题出在路线上,以 Braintree 的形式,我通过了一个 :url

<%= form_for :customer, :url => Braintree::TransparentRedirect.url do |f| %>

现在,当我运行这样的功能测试时:

  it 'should make new payment info' do

    login

    visit new_customer_path

    page.fill_in 'customer_credit_card_number', :with => '4111111111111111'
    page.fill_in 'customer_credit_card_expiration_date', :with => '01/25'
    page.fill_in 'customer_credit_card_cvv', :with => '400'
    page.click_button 'Save Payment Info'

    page.should have_content('Payment Info Confirmation')
    page.should have_content('411111******1111')
  end

我在路线上遇到错误:

    Failure/Error: page.click_button 'Save Payment Info'
 ActionController::RoutingError:
   No route matches [POST] "/merchants/fvn6vfc5ptyg2xrp/transparent_redirect_requests"

我也在控制器测试中尝试过这个(使用render_views):

  it 'should make new payment info' do
    sign_in_as_user

    visit new_customer_path

    page.fill_in 'customer_credit_card_number', :with => '4111111111111111'
    page.fill_in 'customer_credit_card_expiration_date', :with => '01/25'
    page.fill_in 'customer_credit_card_cvv', :with => '400'
    page.click_button 'Save Payment Info'
    save_and_open_page
   page.should have_content('Payment Info Confirmation')
   page.should have_content('411111******1111')
  end

路线上同样的错误...

在浏览器的开发环境中它工作正常,我看起来像我表单中的 :url 选项被水豚忽略了?我想知道是否有人可以帮助我解决这个问题?

当我在该项目上运行测试时,我还为 Braintree with Rails 找到了这些示例应用程序:https ://github.com/braintree/braintree_ruby_examples/blob/master/rails3_tr_devise/spec/controllers/customer_controller_spec.rb。也许我的问题与 Rails 和 rspec 的版本有关?

提前谢谢了!!

4

1 回答 1

4

实际上,我在我的Multitenancy with Rails书中涵盖了这个确切的场景。

您的测试和 Braintree 项目测试的区别在于您的测试是 Capybara 功能,而他们的测试是控制器规格。

我在书中提到了 Capybara README 的相关部分:

RackTest 是 Capybara 的默认驱动程序。它是用纯 Ruby 编写的,不支持执行 JavaScript。由于 RackTest 驱动程序直接与 Rack 接口交互,它不需要启动服务器。但是,这意味着如果您的应用程序不是 Rack 应用程序(Rails、Sinatra 和大多数其他 Ruby 框架都是 Rack 应用程序),那么您不能使用此驱动程序。此外,您不能使用 RackTest 驱动程序测试远程应用程序,或访问您的应用程序可能与之交互的远程 URL(例如,重定向到外部站点、外部 API 或 OAuth 服务)。

我解决它的方法是我编写了一个名为的 gem fake_braintree_redirect,它在测试环境期间将一个中间件插入到请求堆栈中,以捕获这些请求并适当地响应。initializer使用定义在 中的块将中间件添加到堆栈中application.rb,如下所示:

initializer 'middleware.fake_braintree_redirect' do
  if Rails.env.test?
    require 'fake_braintree_redirect'
    config.middleware.use FakeBraintreeRedirect
  end
end

这将 Braintree 完全排除在外,并在您向其发送数据时返回成功的响应。


或者,如果您真的想针对 Braintree 的沙箱进行测试,您可以通过将您的标签标记scenario为来切换到 JavaScript 驱动程序:

 scenario "foo", :js => true
于 2013-08-11T22:57:05.717 回答