茉莉单元测试:我应该测试逻辑或实际模拟数据



执行单元测试时,测试我希望将其硬编码对测试(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()中的逻辑。

最新更新