使用 Javascript 进行 Rspec 控制器测试

Posted

技术标签:

【中文标题】使用 Javascript 进行 Rspec 控制器测试【英文标题】:Rspec Controller testing with Javascript 【发布时间】:2012-09-18 05:14:57 【问题描述】:

如果控制器仅使用 javascript 响应,您如何在 Rspec 中测试控制器?例如,这将是我的实际代码:

一些view.html.erb

link_to 'More Chips', add_chips_path, :remote => true

芯片控制器

def add_chips
  Chips.create(:color => :red)
  @chips = Chips.all
end

add_chips.js.erb

$('#chip_count').html('<%=j render("chips/list", :chips => @chips) %>');

Rspec 测试

spec/controllers/chips_controller_spec

it "should add chips" do 
  post :add_chips, :format => 'js'
end

当我尝试使用 RSpec 发布到此内容时,我收到 Missing Template 错误,因为它正在发送 HTML 请求但没有 HTML 视图。我试过传递一种格式,但这似乎不起作用。我知道我可以放入一个“虚拟”html 视图以使其通过,但这似乎是一种 hack。

谢谢

【问题讨论】:

【参考方案1】:

如果您尝试从控制器规范执行 Ajax 请求,而不是执行 post :add_chips 并将 format 作为参数传递,您应该这样做:

xhr :post, :add_chips, @params

...参数中没有format。这将执行一个 JavaScript 请求并使用 .js 模板进行响应。

更新:

在最新版本的 Rails/RSpec 中,您应该这样做:

post :add_chips, params: @params, xhr: true

【讨论】:

【参考方案2】:

好的,我知道我做错了什么。我在测试中传递了一个参数散列,格式需要包含在同一个散列中。所以而不是这个:

@params = :chip_color => 'red'
...
post :add_chips, @params, :format => 'js'

它需要看起来像这样

@params = :chip_color => 'red', :format => 'js'
...
post :add_chips, @params

【讨论】:

以上是关于使用 Javascript 进行 Rspec 控制器测试的主要内容,如果未能解决你的问题,请参考以下文章

Rspec用于检查用户使用设计宝石登录或未登录的天气

如何使用 rspec 生成控制器规范?

无法用 RSpec 比较时间

RSpec 控制器测试 - 空白 response.body

RSpec控制器测试 - 空白响应.body

使用应该匹配器使用 RSPEC 测试我的控制器时发生错误,特别是创建我无法测试保存功能