如何使用 Minitest 触发 JS 控制器操作
How to trigger a JS controller action with Minitest
在测试中我想模拟一个只接受JS请求的请求。我试过 "normal" 风格:
patch study_update_user_vocab_path(@user, @vocabs[index]),
{ strength: "1", resume_study_index: "index" }
这里,"strength"和"resume_study_index"是表单字段的id。当 运行 测试时,我收到以下错误消息:
ActionView::MissingTemplate: ActionView::MissingTemplate: Missing template vocabs/study_update, application/study_update with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}.
这很合理,因为没有要渲染的视图。但是我如何告诉 Mini:Test 到 trigger/expect JS?
我可以想到两个办法
在您的路线中,将 defaults: { formats: 'js' } }
添加到 study_update_user_vocab_path。所以它将是 patch 'blah/path', to: 'controller#action', as: :study_update_user_vocab, defaults: { formats: 'js' } }
在您的测试中,写出完整路径并在末尾添加 .js。所以patch "/users/#{@user.id}/vocabs/#{vocabs[index]}.js", { strength: "1", resume_study_index: "index" }
在控制器测试中,您不会将请求的路径传递给 patch
,而是传递操作,即方法的名称。我假设您的控制器上的方法是 update_user_vocab
,所以如果我错了,请将其替换为您的方法名称。
patch :update_user_vocab, id: @vocabs[index], # The record ID you are working with?
strength: "1", # I assume this is some needed query param
resume_study_index: "index", #same
format: "js" # send this as a js request
在测试中我想模拟一个只接受JS请求的请求。我试过 "normal" 风格:
patch study_update_user_vocab_path(@user, @vocabs[index]),
{ strength: "1", resume_study_index: "index" }
这里,"strength"和"resume_study_index"是表单字段的id。当 运行 测试时,我收到以下错误消息:
ActionView::MissingTemplate: ActionView::MissingTemplate: Missing template vocabs/study_update, application/study_update with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}.
这很合理,因为没有要渲染的视图。但是我如何告诉 Mini:Test 到 trigger/expect JS?
我可以想到两个办法
在您的路线中,将
defaults: { formats: 'js' } }
添加到 study_update_user_vocab_path。所以它将是patch 'blah/path', to: 'controller#action', as: :study_update_user_vocab, defaults: { formats: 'js' } }
在您的测试中,写出完整路径并在末尾添加 .js。所以
patch "/users/#{@user.id}/vocabs/#{vocabs[index]}.js", { strength: "1", resume_study_index: "index" }
在控制器测试中,您不会将请求的路径传递给 patch
,而是传递操作,即方法的名称。我假设您的控制器上的方法是 update_user_vocab
,所以如果我错了,请将其替换为您的方法名称。
patch :update_user_vocab, id: @vocabs[index], # The record ID you are working with?
strength: "1", # I assume this is some needed query param
resume_study_index: "index", #same
format: "js" # send this as a js request