【问题标题】:How to trigger a JS controller action with Minitest如何使用 Minitest 触发 JS 控制器动作
【发布时间】:2015-03-10 16:18:19
【问题描述】:

在测试中我想模拟一个只接受 JS 请求的请求。我以“正常”风格尝试过:

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 触发/期待 JS?

【问题讨论】:

    标签: javascript ruby-on-rails integration-testing minitest


    【解决方案1】:

    我可以想到两种方法。

    1. 在您的路线中,将 defaults: { formats: 'js' } } 添加到 study_update_user_vocab_path。所以应该是patch 'blah/path', to: 'controller#action', as: :study_update_user_vocab, defaults: { formats: 'js' } }

    2. 在您的测试中,写出完整路径并将 .js 添加到末尾。所以patch "/users/#{@user.id}/vocabs/#{vocabs[index]}.js", { strength: "1", resume_study_index: "index" }

    【讨论】:

    • To 1.: 当我将默认参数添加到路由时,我得到这个错误:ActionController::UrlGenerationError: No route matches {:action=>"study_update", :controller=>"vocabs", :format=>nil, :id=>nil, ...。看起来该路线无效。我在我的 routes.rb 中这样做了:patch 'study_update', defaults: { format: 'js' } 有什么问题吗?
    【解决方案2】:

    在控制器测试中,您不会将请求的路径传递给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
    

    【讨论】:

    • 其实是集成测试。这对我的情况有什么影响吗?在您的回答中,user.id 呢?我想你忘了它并尝试了这个:patch :study_update_user_vocab, id: @vocabs[index], user_id: @user.id, strength: "1", resume_study_index: "index", format: "js",我收到以下错误消息:ArgumentError: ArgumentError: bad argument (expected URI object or URI string) 所以看起来它期待的是一条路径而不是一个动作?这种期望是否会随着不同的测试类型(控制器、集成等)而改变?
    • 试试patch study_update_user_vocab_path(@user, @vocabs[index], format: :js), { strength: "1", resume_study_index: "index" }
    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多