使用Javascript进行Rspec控制器测试

20
你如何在 RSpec 中测试控制器,如果该控制器只使用 JavaScript 响应?例如,下面是我的实际代码:

一些 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进行发布时,由于发送的是HTML请求但没有HTML视图,因此会出现“缺少模板”错误。 我已经尝试传递格式,但似乎不起作用。 我知道我可以添加一个“虚拟”的HTML视图来使其通过,但这看起来像是一种hack。

谢谢

2个回答

47

如果您想从控制器的规范中执行Ajax请求,而不是使用post :add_chips并将format作为参数传递,您应该执行以下操作:

```ruby xhr :post, :add_chips ```
```xhr```方法允许在控制器规范中进行Ajax请求。
xhr :post, :add_chips, @params

如果在参数中没有使用format,那么将会进行JavaScript请求,并响应.js模板。

更新:

在最近的Rails/RSpec版本中,你应该改为这样做:

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

19

好的,我找到了我的错误所在。我在测试中传递了一个参数哈希表,但需要在同一哈希表中包含格式。所以不是这样:

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

它需要看起来像这样

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接