当我更改应用程序代码时,我必须记住更改测试中的模拟函数

When I change my application code do I have to remember to change the mocked functions in my tests?

本文关键字:测试 函数 模拟 代码 应用程序      更新时间:2023-09-26

所以我正在单元测试我的User类,它会调用我的Database类。所以现在我有这个-

User.prototype.getUsername = function() {
    user = Database.loadUser(1);
    return user.username;
}
Database.prototype.loadUser = function(userId) {
    // Load user data from the database
    return {
        username: loadedUser.username,
        password: loadedUser.password,
        age: loadedUser.age
    };
}

因此,我模拟DatabaseloadUser()函数,以便将我的User测试与数据库层隔离开来。我让模拟的loadUser()函数返回一个与实际loadUser函数具有相同属性的对象-

MockDatabase.loadUser = function(userId) 
    return {
        username: 'mockUsername',
        password: 'mockPassword',
        age: 1
    };
}

所以这一切都很好。现在假设几天后我更改了数据库loadUser函数的属性,使其看起来像这样-

Database.prototype.loadUser = function(userId) {
    // Load user data from the database
    return {
        firstNanme: loadedUser.firstName,
        surname: loadedUser.surname
        password: loadedUser.password,
        age: loadedUser.age
    };
}

现在,我的User类在测试过程中仍然使用MockDatabase.loadUser()函数作为mock,即使在实际程序运行时会出现异常,测试也会通过,因为真正的Database.loadUser函数不再具有"username"属性。

那么这个问题的解决方案是什么呢?我想这是一种非常常见的情况。我只需要记住始终保持模拟函数与真实函数同步吗?这似乎是一种效率很低、容易出错的做事方式。。?

在对实际loadUser函数进行更改之前,您应该更新您的测试loadUser函数。测试驱动开发不仅适用于首次编写代码的时间,还适用于您进行的任何后续更改