深入茉莉花间谍

时间:2013-06-04 05:52:23

标签: javascript unit-testing bdd jasmine

我想问一下关于茉莉花间谍的事情。通常我会像这样使用间谍

function getAuthrize(id) {
$.ajax({
    type: "GET",
    url: "/Account/LogOn" + id,
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});
}
spyOn($, "ajax");
getAuthrize(123);
expect($.ajax).toHaveBeenCalled();

但我想知道如果我想验证更多内容(如ajax调用中调用的url/Account/LogOntype is 'Get'等等,那该怎么办。

提前致谢

2 个答案:

答案 0 :(得分:0)

为此你需要使用假的服务器对象

sinon.fakeServer

这样的东西
describe('view interactions', function(){
    beforeEach(function() {
        this.saveResponse = this.serverResponse.someObj.POST;
        this.server = sinon.fakeServer.create();
        this.server.respondWith(
              'POST',
               this.saveResponse.url,
               this.validResponse(this.saveResponse)
        );
    });

    afterEach(function() {
     this.server.restore();
    });
});

需要确保定义了this.serverResponse对象

答案 1 :(得分:0)

要检查是否使用特定参数调用间谍,请使用toHaveBeenCalledWith,如下所示:

expect($.ajax).toHaveBeenCalled({
    type: "GET",
    url: "/Account/LogOn" + id,
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});

但是当JSON中只有一个字段出错时,这将成为一个非常难以阅读的错误。

另一种方法是使用mostRecentCall.args

var args = $.ajax.mostRecentCall.args[0];
expect(args.type).toEqual('GET')
expect(args.url).toEqual('/Account/LogOn123')

这将导致更好的可读错误,因为您可以看到哪个参数错误。