angular2单元测试 - jasmine语法 - 3
1、异步支持
jasmine支持异步操作的测试
传给beforeEach、afterEach、beforeAll、afterAll、it 方法的函数可以是异步的。
有三种方法可以实现异步测试:
方法一:接收一个可选的回调参数
方法二:promise
方法三:通过在支持异步的环境中使用 async 关键字
1.1 回调函数
代码示例:
describe("Using callbacks", function() {
beforeEach(function(done) {
setTimeout(function() {
value = 0;
done();
},
1);
});
it("should support async execution of test preparation and expectations", function(done) {
value++;
expect(value).toBeGreaterThan(0);
done();
});
describe("A spec using done.fail", function() {
var foo = function(x, callBack1, callBack2) {
if (x) {
setTimeout(callBack1, 0);
} else {
setTimeout(callBack2, 0);
}
};
it("should not call the second callBack", function(done) {
foo(true, done, function() {
done.fail("Second callback has been called");
});
});
});
});
代码示例讲解:
在调用beforeEach、afterEach、beforeAll、afterAll、it 时,在传入的函数中填入一个可选的参数(回调函数),异步工作完成时,执行该参数(回调函数)
在beforeEach传入的函数中添加回调函数参数,其后的 it 将在其回调函数执行之后才会执行
1.2 promise
代码示例:
describe("Using promises", function() {
if (!browserHasPromises()) {
return;
}
beforeEach(function() {
return soon().then(function() {
value = 0;
});
});
it("should support async execution of test preparation and expectations", function() {
return soon().then(function() {
value++;
expect(value).toBeGreaterThan(0);
});
});
function browserHasPromises() {
return typeof Promise !== 'undefined';
}
function soon() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve();
}, 1);
});
}
});
示例代码讲解:
在调用beforeEach、afterEach、beforeAll、afterAll、it 时,传入的函数,可以返回一个promise,这个promise在异步工作完成时解析,如果promise被拒绝,则 describe下的所有 it 都将失败。
在调用promise的beforeEach返回结果,
promise返回 resove , it 才会执行,
promise返回 reject,it 失败
1.3使用关键字 async/await
代码示例:
describe("Using async/await", function() {
if (!browserHasAsyncAwaitSupport()) {
return;
}
beforeEach(async function() {
await soon();
value = 0;
});
it("should support async execution of test preparation and expectations", async function() {
await soon();
value++;
expect(value).toBeGreaterThan(0);
});
});
// 此段代码暂时未搞明白,后续补充
describe("long asynchronous specs", function() {
beforeEach(function(done) {
done();
},
1000);
it("takes a long time", function(done) {
setTimeout(function() {
done();
},
9000);
},
10000);
afterEach(function(done) {
done();
},
1000);
});
function soon() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve();
},
1);
});
}
function browserHasPromises() {
return typeof Promise !== 'undefined';
}
function getAsyncCtor() {
try {
eval("var func = async function(){};");
} catch(e) {
return null;
}
return Object.getPrototypeOf(func).constructor;
}
function browserHasAsyncAwaitSupport() {
return getAsyncCtor() !== null;
}
示例代码讲解:
在调用afterEach、beforeEach、afterAll、beforeAll、it 时,传入的函数,可以在支持异步环境中声明为 async 。
函数内部声明 await xxx(); 在xxx() 返回成功之后,函数内部代码才会执行
如果在整个套件的不同地方用到了 timeout ,可以在 describe 外边设置全局的 jasmine.DEFAULT_TIMEOUT_INTERVAL(jasmine方法中默认的异步超时时间(毫秒))

浙公网安备 33010602011771号