如何修改Minitest的create测试以适配turbo_stream响应?
Rails 7 Turbo Stream 场景下的Minitest控制器测试适配方案
你之前写法不生效的核心原因有两个:
format: :turbo_stream不应该放到params哈希内部,Rails测试接口中format是独立于请求参数的顶层参数- 原测试中的
assert_redirected_to断言不符合Turbo Stream的响应逻辑:默认配置下,响应Turbo Stream的create动作不会返回302重定向状态码,而是返回200 OK,响应体为Turbo Stream操作指令
正确写法1:指定顶层format参数
test "should create user via turbo stream" do assert_difference('User.count') do # format作为post方法的独立参数传入,不要放到params里 post users_url, params: { user: valid_params }, format: :turbo_stream end # 替换原有的重定向断言,根据实际业务逻辑调整 assert_response :ok # 可选:校验返回的turbo stream动作符合预期,比如新增用户条目 assert_includes response.body, 'turbo-stream action="append"' end
正确写法2:模拟浏览器Turbo请求头(更贴近真实场景)
如果希望完全还原浏览器发起Turbo请求的逻辑,可以手动指定Accept请求头:
test "should create user with turbo stream request header" do assert_difference('User.count') do post users_url, params: { user: valid_params }, headers: { "Accept" => "text/vnd.turbo-stream.html" } end assert_response :ok end
额外注意事项
- 如果你的控制器create动作在成功后主动返回了Turbo格式的重定向指令,不需要校验响应状态码为302,而是要校验响应体中包含
action="redirect"的turbo-stream标签 - 如果你使用的是Minitest系统测试(System Test)而非控制器单元测试,不需要手动添加format或请求头,Capybara配合内置的Turbo驱动会自动处理请求适配,和真实用户操作行为完全一致
内容的提问来源于stack exchange,提问作者hellion
相关产品推荐
相关产品推荐

