如何确保数据库查询在 QUnit 中执行单元测试之前完成

How to ensure Database Query finishes before unit tests executed in QUnit

我正在尝试 运行 使用 QUnit 在我的 Web 应用程序上进行单元测试,我需要一种方法来在单元测试 运行 之前设置数据库测试数据。为每个测试手动输入和从数据库中删除测试数据是一个非常缓慢和重复的过程。

我在服务器端编写了一些临时请求处理程序,用于处理下面代码中显示的 'BEFORE' 请求。

问题是修改数据库需要很长时间,因此 QUnit 测试在数据库测试数据有机会更新之前运行开始。

我能找到的最佳参考是 https://api.qunitjs.com/QUnit.module/(在页面底部)。它表明可以使用 promises 在 'before' 和 'after' 函数中打开和关闭数据库连接。但是,这个例子太简短了,没有提供足够的信息来做我想做的事情。

我想嵌套我的 JQuery 请求,这样测试代码只在收到服务器响应后(更新数据库后)才执行。然而,这使得测试代码难以阅读、重复,并且它忽略了 QUnit 提供的 'before' 和 'after' 钩子的使用。

有什么建议吗?

下面是我目前为单元测试设置数据库的测试代码。

QUnit.module("EMD_4: updateItemQtyRequest",{

before: function(){

    // Rule 2 setup
    $.get( "http://localhost:8080/foodmap/EMD_4_BEFORE.do",
            {cmd:"insert into wants (email,id,qty) values ('only_wants',220,1)"}
          ); 

    // Rule 3 setup
    $.get( "http://localhost:8080/foodmap/EMD_4_BEFORE.do",
            {cmd:"insert into wants (email,id,qty) values ('wants_and_hasWanted',219,1)"}
          );
    $.get( "http://localhost:8080/foodmap/EMD_4_BEFORE.do",
            {cmd:"insert into has_wanted (email,id) values ('wants_and_hasWanted',220)"}
          );  
},
after: function(){
   // cleanup database
}
...Unit Tests ..

the module accepts the assert objectbefore函数,可以指定那段代码是异步的。因此,我认为您可以执行以下代码。也就是说,请注意,我将所有 $.get() 调用嵌套在一起,以便我们知道它们何时全部完成并可以告诉 QUnit 继续前进。

QUnit.module("EMD_4: updateItemQtyRequest",{

  before: function(assert){
    var allDone = assert.async();

    // Rule 2 setup
    $.get( "http://localhost:8080/foodmap/EMD_4_BEFORE.do",
            {cmd:"insert into wants (email,id,qty) values ('only_wants',220,1)"}
    )
    .done(function() {
      // Rule 3 setup
      $.get( "http://localhost:8080/foodmap/EMD_4_BEFORE.do",
              {cmd:"insert into wants (email,id,qty) values ('wants_and_hasWanted',219,1)"}
      )
      .done(function() {
        $.get( "http://localhost:8080/foodmap/EMD_4_BEFORE.do",
                {cmd:"insert into has_wanted (email,id) values ('wants_and_hasWanted',220)"}
        )
        .done(function() {
          // NOW TELL QUNIT WE'RE DONE
          allDone();
        });
      });
    });

  },
  after: function(){
    // cleanup database
  }
});

// ...Unit Tests ...