Stub Rails UJS/Ajax 响应状态以测试 Rspec/Capybara 功能测试中的返回消息

Stub Rails UJS/Ajax responses status to test returning message in Rspec/Capybara feature test

我有 AJAX 个由 Rails UJS 发起的调用我想测试。具体来说,我使用 Rails UJS ajax 事件来处理错误情况。

我想测试它们,但我不知道如何告诉 rspec/capybara 到 "stub" 并假设错误代码

$("button").
      on('ajax:error',function(event,xhr, status, error){
          if(status == "timeout") {
            var msg;
            msg = Messenger().post({
              message:    "This is taking too long"
            });          
          } else {
            var msg;
            msg = Messenger().post({
              message:    "it seems there is a bug. Please try again."
            });
          };
        });

我想做如下事情:

describe "test returning error message", js: true do
   it "should be successful" do        
        visit deal_page_path(deal)
        first('a.button').click 
        stub(:xhr.status) = "timeout"           
        expect(page).to have_content('This is taking too long') 
      end
end

如何操作?

注意:ajax 请求是内部请求,它们不会发送给第三方 API 或服务(例如 ex 的 facebook)。

在使用 Capybara(支持 JS 的驱动程序)进行测试时,它无法访问请求或响应,除非通过它在浏览器中创建的更改。你可以在你的相关控制器中构建一个测试模式,可以打开和关闭它以允许它输出你想要的错误,但最干净的方法可能是使用像 puffing-billy 这样的可编程代理,这将允许你有选择地 return 任何你想要的来自浏览器的任何给定请求。需要意识到的一件事是,这并没有正确测试该应用程序 return 的错误,它只是测试您的前端是否按照您期望的方式处理错误。