我们可以使用Jasmine在测试中执行异步操作吗?

时间:2016-03-24 09:49:39

标签: javascript unit-testing jasmine

我正在学习使用Jasmine进行测试,我正在寻找async测试的一些说明以进一步理解。

在以下代码中,第一个规范中的测试有效,但第二个版本我已​​删除了beforeEach并将异步调用移到了it中。

describe("Working Asnc", function() {
 var value = 0;

 function funcRunInBackground() {
   value = 1;
};  

 function wrapFuncRunInBackground(done) {  
    setTimeout(function() {
       funcRunInBackground();
       done();
    }, 2000);       
 }    

 beforeEach(function(done) {
     wrapFuncRunInBackground(done);          
 });                 

 it("should be greater than 0", function() {
   expect(value).toBeGreaterThan(0);
 });

});

描述("不工作Asnc",function(){       var value = 0;

 function funcRunInBackground() {
   value = 1;
 };  

 function wrapFuncRunInBackground(done) {  
   setTimeout(function() {
       funcRunInBackground();
       done();
   }, 2000);       
 }                 

 it("should be greater than 0", function(done) {
   wrapFuncRunInBackground(done);       
   expect(value).toBeGreaterThan(0);
 });

});

code pen here

如果需要,我们可以使用测试本身进行asnc操作吗?

2 个答案:

答案 0 :(得分:1)

变化

 it("should be greater than 0", function(done) {
   wrapFuncRunInBackground(done);       
   expect(value).toBeGreaterThan(0);
 });

 it("should be greater than 0", function(done) {
   wrapFuncRunInBackground(function() {       
     expect(value).toBeGreaterThan(0);
     done();
   });
 });

回调不会暂停执行,因此在原始代码段中没有任何内容阻止expect(...)调用在调用wrapFuncRunInBackground的异步回调之前运行。

done不是魔术,它只是一个正常的函数,它将测试标记为在调用时完成...

答案 1 :(得分:1)

您无法以这种方式同步js异步代码。您不能等待在不使用zallbacks / promises / co + generators / etc的情况下执行异步代码。 在你的情况下,它应该是这样的:

it("should be greater than 0", function(done) {
   wrapFuncRunInBackground(function(){
       expect(value).toBeGreaterThan(0);
       done();
   });       
 });