【问题标题】:Node Jasmine 2.0 and multiple conditionsNode Jasmine 2.0 和多个条件
【发布时间】:2015-09-30 15:20:43
【问题描述】:

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

【问题讨论】:

  • 这个具体情况可以表示为expect(response.data && response.data.length).toEqual(5),不过@Mbielski的回答很好。

标签: node.js testing jasmine conditional


【解决方案1】:

也许这样的事情可以解决问题:

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

【讨论】:

  • waitsFor and runs 模型是(与间谍),据我所知,是老年的。如标题所述,Jasmine 2.x+ 报告测试结束并带有 done() 回调。不过谢谢你的回答!
【解决方案2】:

如果您坚持 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 它仍然被定义。如果您的函数失败,它会将变量设置为未定义,从而导致测试失败。

【讨论】:

  • 如果 resp.data 未定义,这不也有同样的问题吗?
  • 这取决于您如何构建测试。 OAPT 可以解决很多问题,但不能解决糟糕的结构。并不是说你的不好,只是说它的作用是有限的。话虽如此,我将更新答案以说明 resp 未定义。
【解决方案3】:

问题基本上是 AJAX 块中的错误被抛出了 it() 块的上下文,因此没有被捕获。解决方案是在执行 AJAX 调用的函数中编写一些自定义错误处理,并使其成功或失败,并将“完成”传递给 it 块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多