[LayaAir 1.0]Laya ts版,使用jasmine进行单元测试

使用的Laya ts 1.7.22类库, typescript 3.2.2, npm 5.5.1 
1 创建package.json
{
"scripts": {
"test": "jasmine-ts --config=jasmine.json"
}
}

2 安装jasmine及所需其他库,打开命令行,在项目根目录下
npm i -D jasmine jasmine-ts ts-node typescript @types/jasmine @types/node

3 创建jasmine.json文件
{
"spec_dir": "__tests__",
"spec_files": ["**/*test.ts?(x)"],
"oneFailurePerSpec": false,
"random": true
}

其中spec_dir是单元测试所在文件夹,spec_files是正则指定哪些文件需要作为单元测试文件运行。
 
更改tsconfig.json.
在exclude里增加一项 "__tests__",也就是刚刚的spec_dir文件夹,防止正常编译时把它们也编进bin文件夹里去。
 
4 要测试的文件
假设我有三个文件,一个是src/Functions.ts,内容为
function hello(): string {
return 'Hello World!';
}

一个是src/Library/ToolService.ts, 内容为
module Library{
export class ToolService{
constructor(){

}

public static sum(a:number, b:number):number
{
return a + b;
}
}
}

 
一个是 src/Library/UserService.ts, 内容为
module Library{
export class UserService{
constructor(){

}

public multiple(a:number, b:number):number
{
return a * b;
}
}
}

5 写测试用例
对照第四步的三个文件,写对应的三个测试文件。
第一个是__tests__/Functions.test.tsx
/// <reference path="../src/Functions.ts" />

import fs = require('fs');
import vm = require('vm');

let path = __dirname + "/../bin/js/Functions.js";
let code = fs.readFileSync(path, {encoding:'utf8'});
vm.runInThisContext(code);

describe('Functions', function() {
it('hello', function() {
const result = hello();
expect(result).toBe('Hello World!');
});
});

 
第二个是 __tests__/Library/ToolService.test.tsx
/// <reference path="../../src/Library/ToolService.ts" />

import fs = require('fs');
import vm = require('vm');
let path = __dirname + "/../../bin/js/Library/ToolService.js";
let code = fs.readFileSync(path, {encoding:'utf8'});
vm.runInThisContext(code);

describe('ToolService', function() {
it('sum one', function() {
expect(Library.ToolService.sum(0 ,0)).toBe(0);
});

it('sum two', () => {
expect(Library.ToolService.sum(1, 2)).toBe(3);
});
});

 
 
第三个是 __tests__/Library/UserService.test.tsx
/// <reference path="../../src/Library/UserService.ts" />

import fs = require('fs');
import vm = require('vm');
let path = __dirname + "/../../bin/js/Library/UserService.js";
let code = fs.readFileSync(path, {encoding:'utf8'});
vm.runInThisContext(code);

describe('UserService', function() {
it('multiple one', function() {
let userService = new Library.UserService();
expect(userService.multiple(0 ,0)).toBe(0);
});

it('multiple two', () => {
let userService = new Library.UserService();
expect(userService.multiple(7 ,8)).toBe(56);
});
});

 
6 运行测试用例
首先要编译你的项目,用Laya IDE的编译。
执行npm test
 
看到有类似如下输出,就说明成功了。
5 specs, 0 failures
Finished in 0.023 seconds
 
 
 
 
测试用例怎么写我就不讲了,有兴趣自己查吧。
 
测试用例文件里关键的两步:
1 reference引用要测试的文件(防止Laya IDE 自动检查报错)
2 用vm.runInThisContext引入编译好的js文件,否则执行会报错。
 
个人猜测是测试用例执行时的编译机制与原生ts还是有所不同的,没有根据reference去递归的引入和编译相应的ts文件。
 
另外注意一点,如果要测试的ts文件中使用了其他的类,那么对应的js也要用vm引入,否则会报错。
 
本来我一开始的首选是Jest,但是研究之后发现用vm.runInThisContext引入依旧报错,原因可能得从源码入手了,这是一项长期的工作,短时间内无法完成。就先用Jasmine吧,也是挺好的单元测试框架。
 
demo见这里: laya-ts-jasmine-unittest,包括上面的全部代码,以及有交叉引入class的情况,也包括了一个对 Laya.Byte 类读写的简单测试。 Enjoy yourself !
已邀请:

Henno-汉

赞同来自:

感谢如此高质量的分享,正好需要,谢谢

要回复问题请先

商务合作
商务合作