我真的很喜欢tdd,想要学习一门新语言,并选择了打字稿。不幸的是,我正在努力按照我想要的方式编写测试。
说我正在测试以下课程:
class Container {
private numbers: number[];
constructor(){
this.numbers = [];
}
addNumber(numberToAdd: number) : void {
//implementation
}
removeNumber(numberToRemove: number) : void {
//implementation
}
getNumbers(): number[] {
//implementation
}
}
我的直觉是做这样的事情:
describe( "container", () => {
let sut: Container;
beforeEach(() => sut = new Container());
describe( "add number", () => {
let number1 = 1;
let numbers = sut.getNumbers();
test( "number should be added", () => {
numbers.should.contain(number1);
});
test("exactly one number should have been added", () => {
numbers.length.should.be(0);
});
});
describe( "remove number", () => {
let addedNumber = 2;
sut.addNumber(addedNumber);
sut.removeNumber(addedNumber);
let numbers = sut.getNumbers();
test( "added number should be removed", () => {
numbers.length.should.be(0);
});
});
});
jest不会正确执行此操作。在每个测试语句之前没有实例化Container - 我不知道为什么不这样,也许它不喜欢我的嵌套describe语句?很明显,我可以分别在每个描述中实例化sut,但我会重复代码...
你如何用打字稿写测试?你有什么建议吗?如果你能分享你的最佳实践,那就太好了。也许开玩笑不适合这份工作?
我也想知道是否有人愿意分享一个开源项目的链接,这是如何测试打字稿的一个很好的例子
答案 0 :(得分:0)
您的问题实际上是关于jest
,而不是关于TypeScript。
嵌套describe()
调用中的语句会在调用beforeEach()
之前执行。因此你得到了不确定。
describe( "container", () => {
let sut: Container;
beforeEach(() => sut = new Container());
describe( "add number", () => {
let number1 = 1;
let numbers = sut.getNumbers();
});
describe( "remove number", () => {
let addedNumber = 2;
sut.addNumber(addedNumber);
sut.removeNumber(addedNumber);
let numbers = sut.getNumbers();
});
});
如@JB Nizet所述,您应该使用测试或在他们自己的beforeEach()
调用中移动这些语句。
IMO,我倾向于避免beforeAll()
和beforeEach()
。它使测试更神奇,更难理解。
我建议您创建自己的setup / teardown方法并在测试中调用它们。 e.g:
function setup() {
return new Container();
}
describe( "container", () => {
describe( "remove number", () => {
test( "added number should be removed", () => {
const sut = setup()
sut.addNumber(2);
sut.removeNumber(2);
const actual = sut.getNumbers();
actual.length.should.be(0);
});
});
});