执行单元测试时,测试我希望将其硬编码对测试(expect(x).toBe(17)
)的字面结果更好,或者更好地测试逻辑,而不是特定的模拟我正在使用的数据(expect(x).toBe(mockedData.value)
)
第一种方法似乎更安全,因为我确定测试实际上正在测试我期望的字面结果,但是第二种方法更灵活,因为它允许我测试逻辑,而不是担心模拟数据(我也可以在以后更改,而无需重写测试本身)
这两种方法的优点/缺点是什么?在这些情况下,最好的做法是什么?
以下是一个快速示例:
// 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
})
});
非常感谢!:)
在您的测试中您要测试单元,在您的情况下,这是plusOne()
功能内部的逻辑。因此,您只想知道功能内部是否有所改变。
最危险的途径是使用expect(instance.plusOne()).toBe(17);
,因为如果某人将您的逻辑更改为return this.data.value + 2;
,那么您永远不会在问题出现在功能逻辑中或模拟Data中的情况下。
危险较小的方法是使用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()
中的逻辑。