0

所以我正在对我的 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
    };
}

所以我模拟了数据库 loadUser() 函数,以便我的用户测试与数据库层隔离。我让模拟的 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() 函数作为模拟,即使在实际程序运行时测试也会通过,因为真正的 Database.loadUser 函数不再具有 '用户名的属性。

那么这个问题有什么解决办法呢?我想这是一个非常普遍的情况。我是否只需要记住始终使模拟函数与真实函数保持同步?这似乎是一种非常低效且容易出错的做事方式..?

4

1 回答 1

1

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

于 2013-07-06T12:22:10.680 回答