如何编写具有异步设置和拆卸操作的测试

How can I write tests that have setup and teardown operations that are asynchronous?

本文关键字:操作 测试 设置 何编写 异步      更新时间:2023-09-26

我正在使用一个库(pouchDB(来执行一些异步操作。为了简单起见,我将不涉及细节,因为我认为这是涉及异步操作的"单元测试"的一个常见问题(用引号进行单元测试,因为如果我正在测试与另一个库的集成,我想这不是真正的单元测试。但是,使用QUnit似乎是为其编写测试的最合适的方式(。

我正在使用QUnit来进行js单元测试。我有两个测试。我发现,如果我跑其中一个(同时让另一个被评论掉(,它们就会通过。如果我把它们两个一起跑,跑第二个的就会失败。第二个似乎在第一个的拆卸完成之前运行,这会阻止第二个的设置成功完成。

module("pouchDB integration specs", {
  setup: function(){
   //some setup stuff
    }
  },
  teardown: function(){
   //some teardown stuff    
    });
  }
});
asyncTest("test1", 1, function(){
test1MethodBeingTested();
document.addEventListener("completedTest1Stuff", function(){
      deepEqual(newFriendSchedule, 'new', "Test 1 Looks Good'");
      start();
    });
  });

});
asyncTest("test2", 2, function(){
  stuffBeingTestedForTest2();
  document.addEventListener("test 2 stuff done", function(){
    deepEqual(expectedTest2Result, actualTest1Result, "test 2 looks good!");
    start();    
  })
});

(为垃圾缩进道歉。无论我怎么挣扎,SO的编辑都不喜欢我(

我看了Martin Fowler对测试异步代码的看法,但我从中得出的结论是"你应该设计你的代码,使其不本质上是异步的。"这没有帮助,因为我正在测试与一个库的集成,我不想修改这个库(我也不认为我应该修改这个库-这个问题以前肯定已经处理过了?(

与测试方法类似,您可以在拆卸代码中使用stopstart来暂停测试运行程序,直到清理代码完成(asyncTeststop进行隐式调用(。QUnit为stop/start调用使用计数信号量,因此如果有多个异步任务,则可以多次调用stop

快速示例:

var teardownDone = false;
var tests = 0;
var testContent = function() {
    if (tests > 0) {
        QUnit.ok(teardownDone);
    } else {
        QUnit.ok(true);
        tests++;
    }
};
module('example', {
    teardown: function () {
        // Without this call and the subsequent start(), tests will fail.
        stop();
        setTimeout(function () {
            teardownDone = true;
            start();
        }, 1000);
    }
});
test('test1', testContent);
test('test2', testContent);

JSFiddle