執行單元測試時,測試文字結果是否更好,我希望將其硬編碼到測試中(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
})
});
非常感謝您! :)
這是一個很好的問題,不幸的是,它不適合SO,因爲沒有正確的答案,無論如何都有爭論。在這種情況下,該方法是plusOne,它是有道理的看到斷言是「東西+ 1」。然而,在少數情況下,使用硬編碼的數字時,通常更容易理解正在測試的內容(即使模擬數據更改時測試更脆弱)。 –
TBH您輸入** 17 =輸出17 * *這是沒有測試如果你輸入true =輸出17 **那麼這是一個測試 嘗試對組件進行測試導致你的服務應該總是給出預期的結果,如果你給出了正確的輸入如果不是你的輸入是錯誤的或者你的後臺進程是錯誤的 – Swoox
IMO使用'mockedData'對於這個測試用例來說更具描述性,如果它是:* 16.plusOne應該返回17 *那麼我會同意使用這個文本。你的斷言應該保持接近spec描述 – MinusFour