如何'正确'在打字稿

时间:2018-02-24 14:28:29

标签: typescript tdd jestjs

我真的很喜欢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,但我会重复代码...

你如何用打字稿写测试?你有什么建议吗?如果你能分享你的最佳实践,那就太好了。也许开玩笑不适合这份工作?

我也想知道是否有人愿意分享一个开源项目的链接,这是如何测试打字稿的一个很好的例子

1 个答案:

答案 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);
        });
    });
});