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 并且(当然)找不到它。
我在 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 并且(当然)找不到它。