共享行为
有时候你可能有多个行为相似的类或方法,并且希望在不编写重复规范的情况下对它们中的所有行为进行测试。根据需要,有很多种方法可以做到这一点。
内联 describe/it 循环
使用内联循环来定义 describe
或 it
块可以避免许多相同、简单的测试的重复。
describe('Element', function() {
beforeEach(function() {
this.subject = new Element();
});
['x', 'y', 'width', 'height'].forEach(name => {
describe(name, function() {
it('returns a number', function() {
expect(typeof this.subject[name]()).toBe('number');
});
});
});
});
规范声明帮助器
创建一个单独的声明 describe
或 it
块的帮助器函数,以便在多项测试中重用它。这在描述共享行为时可能很有用。
// Note that this function can exist outside any jasmine block, as long as you
// only call it from inside a jasmine block.
function itActsLikeAPet() {
it('can be fed', function() {
this.subject.feed();
expect(this.subject.hungry()).toBe(false);
});
it('can be watered', function() {
this.subject.drink();
expect(this.subject.thirsty()).toBe(false);
});
}
describe('Dog', function() {
beforeEach(function() {
this.subject = new Dog();
});
itActsLikeAPet();
it('can bark', function() {
this.subject.bark();
});
});
describe('Cat', function() {
beforeEach(function() {
this.subject = new Cat();
});
itActsLikeAPet();
it('can meow', function() {
this.subject.meow();
});
});
警告
在测试中共享行为可能是强大的工具,但请谨慎使用。
-
过度使用复杂帮助器函数可能会导致测试中的逻辑,进而可能产生自己的错误 - 这些错误可能会让你认为你正在测试的并不是你测试的内容。特别注意帮助器函数中的条件逻辑(if 语句)。
-
通过测试循环和帮助器函数定义的大量测试可能会给开发人员带来更大的困难。例如,如果你的测试名称在运行时拼接在一起,则搜索失败规范的名称可能会更加困难。如果需求发生变化,函数可能不再像其他函数那样“适合模具”,这会迫使开发人员进行比单独列出你的测试时更多的重构。