2017-09-12 28 views
-2

執行單元測試時,測試文字結果是否更好,我希望將其硬編碼到測試中(expect(x).toBe(17)),還是測試邏輯而不是我正在使用的特定模擬數據更好(expect(x).toBe(mockedData.value)Jasmine單元測試:我應該測試邏輯還是實際的模擬數據?

第一種方法似乎比較安全,因爲我確定測試實際上是測試我期望的文字結果,但第二種方法更靈活,因爲它允許我測試邏輯而不是擔心模擬數據(我也可以稍後改變而不必重寫測試本身)

這兩種方法的優點/缺點是什麼?這些情況下的最佳做法是什麼?

下面是一個簡單的例子:

// MockedData is a very long array of complex objects 
// each of them has a property 'value' of type number 
import mockedData from 'data.mock'; 

class ClassToTest { 
    private data; 
    constructor(data) { 
     this.data = data; 
    } 
    plusOne(): number { 
     return this.data.value + 1; 
    } 
} 

describe('test',() => { 
    let instance: ClassToTest; 
    beforeEach(() => { 
     instance = new ClassToTest(mockedData[0]); 
    }) 
    it('plusOne() should return the property "value" plus one',() => { 
     // Should I write this... 
     expect(instance.plusOne()).toBe(mockedData[0] + 1); 
     // ...or this? 
     expect(instance.plusOne()).toBe(17); // Because I know that mockedData[0].value is 16 
    }) 
}); 

非常感謝您! :)

+1

這是一個很好的問題,不幸的是,它不適合SO,因爲沒有正確的答案,無論如何都有爭論。在這種情況下,該方法是plusOne,它是有道理的看到斷言是「東西+ 1」。然而,在少數情況下,使用硬編碼的數字時,通常更容易理解正在測試的內容(即使模擬數據更改時測試更脆弱)。 –

+0

TBH您輸入** 17 =輸出17 * *這是沒有測試如果你輸入true =輸出17 **那麼這是一個測試 嘗試對組件進行測試導致你的服務應該總是給出預期的結果,如果你給出了正確的輸入如果不是你的輸入是錯誤的或者你的後臺進程是錯誤的 – Swoox

+0

IMO使用'mockedData'對於這個測試用例來說更具描述性,如果它是:* 16.plusOne應該返回17 *那麼我會同意使用這個文本。你的斷言應該保持接近spec描述 – MinusFour

回答

1

在你的測試中,你想測試你的單元,在你的情況下是plusOne()函數的邏輯。所以你只想知道函數內部是否有變化。

最危險的路徑是使用expect(instance.plusOne()).toBe(17);,因爲如果有人將您的邏輯更改爲return this.data.value + 2;,那麼只有當問題出現在函數邏輯或mockedData中時,纔會從測試中發現。

危險性較低的方法是使用expect(instance.plusOne()).toBe(mockedData[0] + 1);,因爲這會告訴您函數中的邏輯是否更改。仍然不是最佳的,因爲你依靠外部模擬來運行你不需要的測試。你爲什麼要依賴外部模擬數據來測試你的單元?

在這裏測試單元的邏輯,最好的辦法是做這樣的事情:

describe('test',() => { 
    let instance: ClassToTest; 
    const mockedValue = 1; 
    beforeEach(() => { 
     instance = new ClassToTest(mockedValue); 
    }) 
    it('plusOne() should return the property "value" plus one',() => { 
     expect(instance.plusOne()).toBe(mockedValue + 1); 
    }) 
}); 

然後,您可以實現單獨的測試爲您服務,在這裏你只測試裏面plusOne()邏輯。