使用Javascript进行Rspec控制器测试

hoi*_*omt 19 rspec2 rspec-rails ruby-on-rails-3.1

如果控制器只响应javascript,你如何测试Rspec中的控制器?例如,这将是我的实际代码:

一些view.html.erb

link_to 'More Chips', add_chips_path, :remote => true
Run Code Online (Sandbox Code Playgroud)

chips_controller

def add_chips
  Chips.create(:color => :red)
  @chips = Chips.all
end
Run Code Online (Sandbox Code Playgroud)

add_chips.js.erb

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

Rspec测试

规格/控制器/ chips_controller_spec

it "should add chips" do 
  post :add_chips, :format => 'js'
end
Run Code Online (Sandbox Code Playgroud)

当我尝试使用RSpec发布到此时,我收到一个Missing Template错误,因为它正在发送HTML请求,但没有HTML视图.我试过传递一种格式,但似乎没有用.我知道我可以放入一个"虚拟"html视图来使它通过,但这似乎是一个黑客.

谢谢

Jim*_*art 45

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

xhr :post, :add_chips, @params
Run Code Online (Sandbox Code Playgroud)

......没有参考format.这将执行JavaScript请求并使用.js模板进行响应.

更新:

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

post :add_chips, params: @params, xhr: true
Run Code Online (Sandbox Code Playgroud)


hoi*_*omt 17

好吧,我弄清楚我做错了什么.我正在使用我的测试传递参数哈希,并且格式需要包含在相同的哈希中.所以不要这样:

@params = {:chip_color => 'red'}
...
post :add_chips, @params, :format => 'js'
Run Code Online (Sandbox Code Playgroud)

它需要看起来像这样

@params = {:chip_color => 'red', :format => 'js'}
...
post :add_chips, @params
Run Code Online (Sandbox Code Playgroud)