节点Jasmine 2.0和多个条件

时间:2015-09-30 15:20:43

标签: node.js testing jasmine conditional

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,这将导致整个测试套件崩溃。然后,在测试用例中编写条件通常是不受欢迎的。这种情况我还有其他选择吗?鉴于大多数测试的异步特性,这是一个非常常见的问题。

3 个答案:

答案 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
    });
}

来源:http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=-1PVhTWm6xy

答案 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块。