如何在Capybara的Rails中进行功能测试以及如何知道500错误?

时间:2015-04-10 05:01:06

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

我在我的Rails应用程序中创建了一个路径:

scope 'product' do
  get '/', to: 'product#sort', as: 'product'
end

然后我想用Capybara测试我的功能:

# spec/features/product_spec.rb
require 'spec_helper'

feature 'Product', type: :feature do
  describe 'Main page' do
    context 'Before login' do
      it 'Show product list' do
        visit product_path
        expect(page).to have_content('Product List')
      end
    end
  end
end

但是在我在终端上运行rspec之后,它向我展示了:

Failure/Error: expect(page).to have_content('Product List')
  expected to find text "Product List" in "500 Internal Server Error"

为什么它给了我一个500错误?发生了什么?如何查看错误详细信息?

在我的控制器和视图中,我设置了@product_categories

在控制器中:

# app/controllers/product_controller.rb
class ProductController < ApplicationController
  def sort
    @product_categories = ProductCategory.all
    @products = Product.all
  end
end

在视图中:

# app/views/product/sort.html.erb
<h1>Product List</h1>

<% @product_categories.each do |category| %>
  <%= category.name %>
<% end %>

<% @products.each do |product| %>
  <%= product.name %>
<% end %>

是否有必要在规范测试源中定义该值?

1 个答案:

答案 0 :(得分:0)

您正在课堂上调用.each。我想你的意思是

@product_categories = ProductCategories.all

在您的控制器中。此外,按照惯例,您的控制器和视图文件夹名称应该是复数形式,因此products_controller.rb具有类名ProductsController和视图文件夹看起来像app/views/products/sort.html.erb。在您的路线中,也会像'products#sort'那样复数控制器。

至于你的测试,似乎你正在使用rspec和capybara DSL的混合。如果您使用功能,则不需要:type => :feature。您需要将descriptioncontextit合并到scenario中。请参阅此处,了解使用带有Rspec内置DSL部分的Capybara中的示例:https://github.com/jnicklas/capybara