共享行為
有時你有多個類別或方法有類似的行為,而且你想要對所有這些測試這些行為,而不用編寫重複的規格。有許多方法可以做到這一點,這取決於你的需要。
內聯 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 語句)。
-
讓大量的測試由測試迴圈和助手函式定義可能會讓開發人員的生活更艱難。例如,如果你的測試名稱是在執行時拼湊起來的,那麼搜尋失敗規格名稱可能會變得更困難。如果需求發生變更,一個函式可能不再像其他函式一樣「符合模式」,這會迫使開發人員進行比單獨列出你的測試更大量的重構。