Rspec 测试失败的错误与在浏览器中看到的错误不同

Rspec error for failing test different than the error seen in browser

我在 rails app.I 中使用 RSpec v3.1.0 和 Capybara v2.3.0 spec/features/user_creates_todo_spec.rb.

require 'rails_helper'

feature 'User creates todo' do 
    scenario 'successfully' do
        visit root_path

        click_on 'Add a new todo'
        fill_in 'Title', with: 'Buy milk'
        click_on 'Submit'

        expect(page).to have_css '.todos li', text: 'Buy milk'
    end
end

然后在我的 app/views/todos/index.html.erb 中,我添加了以下内容:

<%= link_to "Add a new todo", new_todo_path %>

当我运行 rspec spec/features/user_creates_todo_spec.rb 时,测试失败并出现错误 Capybara::ElementNotFound: 无法找到link 或按钮 "Add a new todo"

但是,我预计错误是:未定义的局部变量或方法 'new_todo_path',因为我已经在我的视图中定义了 link。奇怪的是,当我运行 rails 服务器并从浏览器导航到根路径时,我看到未定义的局部变量或方法 'new_todo_path' error.Also,我看到未定义的路径错误当我只是从我的应用程序的根目录运行 rake 时。那么,为什么当我使用 rspec 单独运行规范文件时,即使我将 link 添加到页面,我也会看到不同的错误?

谢谢

那是因为link没有添加到页面。 new_todo_path 未定义,这可能意味着您没有在 routes.rb 文件中为其添加正确的路由。

不要忘记 Capybara 正在打开一个浏览器会话,它在一个新进程中运行,并导航到一个路径,就像用户一样。您的 Rails 应用程序可能确实会引发异常,但 Capybara 只查看浏览器中的响应——它不知道 Rails 服务器运行的进程中发生了什么。所以它尽职尽责地访问 url,获取 500 错误页面,寻找 link 并且(当然)找不到它。