jasmine.js expect()在异步回调中不起作用

时间:2013-02-28 17:26:35

标签: javascript ajax bdd jasmine

我熟悉了Jasmine(http://pivotal.github.com/jasmine/)并发现了一些令人困惑的事情:

it("should be able to send a Ghost Request", function() {
  var api = fm.api_wrapper;

  api.sendGhostRequest(function(response) {
    console.dir('server says: ', response);
  });

  expect(true).toEqual(false);
});

按预期失败。

但是,在回调中移动expect调用:

it("should be able to send a Ghost Request", function() {
  var api = fm.api_wrapper;

  api.sendGhostRequest(function(response) {
    console.dir('server says: ', response);
    expect(true).toEqual(false);
  });
});

以某种方式通过:O

经过一些调试: api.sendGhostRequest()执行异步ajax请求,jasmine在请求完成之前冲过去。

因此问题:

如何在确定测试结果之前让茉莉花等待ajax执行?

3 个答案:

答案 0 :(得分:14)

编辑Jasmine 2

异步测试在Jasmine 2中变得更加简单。任何需要处理异步代码的测试都可以使用回调编写,这将指示测试的完成。请参阅标题异步支持

下的Jasmine 2 docs
it('should be able to send a ghost request', (done) => {
    api.sendGhostRequest((response) => {
        console.log(`Server says ${response}`);
        expect(true).toEqual(false);
        done();
    });
});

Jasmine 1

在标题异步支持下的Jasmine site上查看 waitsFor()运行()

使用run和waititsfor会强制Jasmine等待ajax调用完成或暂停。

代码如下:

it("should be able to send a Ghost Request", function() {
    runs(function() {
        api.sendGhostRequest(function(response) {
            console.dir('server says: ', response);
            flag = true;
        });
    }, 500);

    waitsFor(function() {
        return flag;
    }, "Flag should be set", 750);

    runs(function() {
        expect(true).toEqual(false);
    });
}

在这种情况下,期望会失败。

答案 1 :(得分:4)

正如@pkopac所评论的那样,{v}赞成使用runs()回调,而https://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support

已弃用waitsFor()done()
it("should be able to send a Ghost Request", function(done) {
    var api = fm.api_wrapper;

    var success = function(response) {
        console.dir('server says: ', response);
        expect(response).toEqual('test response')
        done();
    };

    api.sendGhostRequest(success);
});

答案 2 :(得分:1)

查看runs()和waitfor()

具体来说,您可以调用waitfor来检查回调是否以某种方式运行(可能使用布尔值作为检查?)然后运行期望。

运行允许您等到waitfor完成。

async jasmine documentation