gpt4 book ai didi

ruby-on-rails - 为什么 rspec 找不到我不需要参数的路线?

转载 作者:行者123 更新时间:2023-12-05 02:56:14 25 4
gpt4 key购买 nike

背景

我正在尝试将旧的 ActionDispatch::IntegrationTest 测试移植到 rspec。

此测试当前通过:

require 'test_helper'

class HeartbeatControllerTest < ActionDispatch::IntegrationTest
test "heartbeat" do
get "/heartbeat"
assert_response :success
end
end

Controller

我有一个返回 200 的 HeartbeatController:

class HeartbeatController < ApplicationController
def show
render(json: { 'status': 'ok' })
end
end

它与 curl 一起工作得很好。

路线

rake routes 显示路线:

                               Prefix Verb   URI Pattern                                                                              Controller#Action
heartbeat GET /heartbeat(.:format) heartbeat#show

规范

我的测试非常简单:

require 'rails_helper'

describe HeartbeatController do
it 'succeeds' do
get '/heartbeat'
expect(response).to be_success
end
end

但是当我运行它的时候

Failures:

1) HeartbeatController succeeds
Failure/Error: get '/heartbeat'

ActionController::UrlGenerationError:
No route matches {:action=>"/heartbeat", :controller=>"heartbeat"}
# ./spec/controllers/heartbeat_controller_spec.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.00718 seconds (files took 1.11 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/controllers/heartbeat_controller_spec.rb:4 # HeartbeatController succeeds

问题

  • 为什么这个测试失败了?
  • 我做错了什么?
  • 如果 Stack Overflow 不存在,我该如何进一步调试?

最佳答案

如果这是一个 Controller 规范,您希望传递方法的名称而不是路由。

require 'rails_helper'

describe HeartbeatController do
it 'succeeds' do
get :show
expect(response).to be_success
end
end

Controller 规范实际上并不驱动整个 Rails 堆栈 - 它们只是创建一个模拟请求并将其传递给 Controller ​​实例并调用 Controller 上的方法。

您收到路由错误的原因是 ActionController::TestCase::Behavior 尝试验证给定 Controller /方法名称组合的路由是否存在。因此 没有路由匹配 {:action=>"/heartbeat", :controller=>"heartbeat"}

众所周知, Controller 单元测试的整个过程存在严重缺陷,因为您模拟了框架的大部分内容,而不是实际测试 Controller 的功能 - 它们会响应 HTTP 请求。由于路由层和中间件堆栈是模拟出来的,因此您的测试不会像真正的集成测试那样覆盖它们。

Rails and RSpec team discourage directly testing controllers .而是使用 request specs这实际上驱动了整个堆栈。

# spec/requests/heartbeats_spec.rb
require 'rails_helper'

describe 'Heartbeats', type: :request do
describe "GET /heartbeat" do
it 'succeeds' do
get '/heartbeat'
expect(response).to be_successful
end
end
end

关于ruby-on-rails - 为什么 rspec 找不到我不需要参数的路线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60679841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com