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方法中默认的异步超时时间(毫秒))