Skip to content

最小准备数据原则

在准备测试数据的时候,没必要提供和当前要测试的功能无关的数据,有效保持单元测试的可读性

有时候为了能够减少没必要的数据,会更改业务层的代码,为没必要的数据增加默认值。有些人认为,为了测试代码去更改业务代码是不应该的

ts
// 业务代码的改动 以 User 为例
class User {
    name: string;
    age: number;
    address: string;

    // ↓ 设置默认值
    constructor(
        name: string;
        age: number = 18;
        address: string = 'beijing'
    ) {
        this.name = name;
        this.age = age;
        this.addres = address;
    }

    buy() {
        return `User ${this.name} bought ${product.name}`
    }
}

// 测试代码
test('', () => {
    const user = new User('cxr');
    const product = new Product('book')

    const result = user.buy(product)

    expect(result).toBe('User Cxr bought Book')

})

但实际上,我们需要明白:单元测试也是业务代码的用户之一,为了提升用户体验而更改业务是非常有必要的。这也是为什么说单元测试可以驱动开发者设计出更完善的程序 api 的原因

还有一种方式可以减少不必要数据的方式,就是利用委托的形式,来为测试用例隐藏这部分数据

ts
// ↓ user 委托
function createUser(name: string) {
    return new User(name, 18, 'beijing')
}
// ↓ product 委托
function createProduct(name: string) {
    return new Product(name, 1, 'a good book')
}

test('', ()=> {
    const user = createUser('cxr');
    const product = createProduct('book')

    const result = user.buy(product)

    expect(result).toBe('User Cxr bought Book')
})

第三种就是使用虚拟对象去模拟目标数据

ts
test('', () => {
    const user = createUser('cxr');
    // ↓ 虚拟对象
    const product = { name: 'book' } as Product 

    const result = user.buy(product)

    expect(result).toBe('User Cxr bought Book')
})