我正在尝试使用QUnit在我的Web应用程序上运行单元测试,我需要一种方法来在运行单元测试之前设置数据库测试数据。每次测试手动输入和擦除数据库中的测试数据都非常缓慢且重复。
我在服务器端编写了一些临时请求处理程序,它们处理下面代码中显示的“BEFORE”请求。
问题是修改数据库需要很长时间,因此QUnit测试在数据库测试数据有机会更新之前就开始运行。
我能找到的最佳参考是https://api.qunitjs.com/QUnit.module/(位于页面底部)。它表明可以使用promises在'before'和'after'函数中打开和关闭数据库连接。但是,这个例子太简短了,并没有提供足够的信息来做我想做的事情。
我想过嵌套我的JQuery请求,以便测试代码只在收到服务器响应后(在更新数据库之后)执行。但是,这使得测试代码难以阅读,重复,并且忽略了QUnit提供的“之前”和“之后”钩子的使用。
有什么建议吗?
以下是我目前用于为单元测试设置数据库的测试代码。
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 ..
答案 0 :(得分:0)
the module的before
函数接受assert
object,它允许您指定该段代码是异步的。因此,我认为您可以执行以下代码。也就是说,请注意我将所有$.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 ...