如何使用sinon在mocha中模拟ajax调用,而不使用回流存储在ractive组件上设置超时

时间:2016-03-15 06:42:27

标签: mocha sinon ractivejs

我有一个工作ractive组件测试用例已经使用mocha使用sinon ans能够模拟ajax调用但是在setTimeout(function(){}, 100)的帮助下我不喜欢使用它。

beforeEach(function () {
  this.container = document.createElement('div');
  document.body.appendChild(this.container);

  this.server = sinon.fakeServer.create();
  this.server.respondWith(
    "GET",
    "/api/url",
    [
      200,
      { "Content-Type": "application/json" },
      '{"data": []}'
    ]
  );
});

afterEach(function () {
  document.body.removeChild(this.container);
});

it("should fetch data from server", function (done) {
  var server = this.server;
  var Component = require('rvc!path/to/component');
  var component = new Component({
    el: this.container,
  });

  setTimeout( function() {
    server.respond();

    expect(component.findAll('.list li').length).to.equal(7);
    done();
  }, 100);

});

正如您在上面的代码中所看到的,我正在使用setTimeout来确保在对组件进行实际测试之前进行了ajax调用(模拟)。

有没有办法可以消除具有相同效果的setTimeout?谢谢!

1 个答案:

答案 0 :(得分:3)

假设您的http请求发生在组件中,那么在事件循环的下一个滴答之前它将不会获取数据。

一种方法是使用setTimeout,但你可能可以降低超时(使用autoRespondAfter来调整sinon响应延迟)。

如果您的组件代码支持它,那么看起来非常适合sinon fakeServer文档中的用例的方法是使用respondImmediately选项:

  

如果设置,服务器将立即响应每个请求   同步。这非常适合在测试中伪造服务器   无需在每次请求后调用server.respond()   那个测试。由于这是同步和即时的,这是不合适的   用于模拟测试或模型中的实际网络延迟。

this.server = sinon.fakeServer.create({ respondImmediately: true })

// now no need to call server.respond() and calls are returned synchronously!