Jasmine有这种时髦的方法,可以在测试中的第一次失败时暂停。一般来说这很好,但它没有问题。我想知道这样的场景的最佳实践是什么:
it('should process async results nicely', function (done) {
this.getJSON('something', function(response) {
expect(response.status).toEqual('ok');
expect(response.data).toBeDefined();
expect(response.data.length).toEqual(5);
done();
}
}
这里的问题是,如果未定义response.data,这将导致整个测试套件崩溃。然后,在测试用例中编写条件通常是不受欢迎的。这种情况我还有其他选择吗?鉴于大多数测试的异步特性,这是一个非常常见的问题。
答案 0 :(得分:0)
也许这样的事情可以解决问题:
it("should make a real AJAX request", function () {
var callback = jasmine.createSpy();
makeAjaxCall(callback);
waitsFor(function() {
return callback.callCount > 0;
}, "The Ajax call timed out.", 5000);
runs(function() {
expect(callback).toHaveBeenCalled();
});
});
function makeAjaxCall(callback) {
$.ajax({
type: "GET",
url: "data.json",
contentType: "application/json; charset=utf-8"
dataType: "json",
success: callback
});
}
答案 1 :(得分:0)
如果您遵守OAPT(每次测试一次断言),您就不会遇到这个问题(以为您可能有其他问题。)
var resp = null;
beforeEach(function(){
this.getJSON('something', function(response){
resp = response;
});
});
it('should have a defined response', function(){
expect(resp).toBeDefined();
});
it('should have a status of OK:', function(){
expect(resp.status).toEqual('ok');
});
it('should have data:', function(){
expect(resp.data).toBeDefined();
});
it('should have a data length of 5', function(){
expect(resp.data.length).toEqual(5);
});
这对于如何处理变量可能并非100%准确,但它应该给你一般的想法。如果第一个失败(期望定义resp变量),您知道您的.getJSON函数有问题。这应该有效,因为即使变量设置为null,它仍然是定义的。如果您的函数失败,它会将变量设置为未定义,从而使测试跳转。
答案 2 :(得分:0)
问题基本上是AJAX块中的错误被抛出it()块的上下文,因此没有被捕获。解决方案是在执行AJAX调用的函数中编写一些自定义错误处理,并使其成功或失败,并将'done'传递给it块。