所以我正在对我的 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 函数不再具有 '用户名的属性。
那么这个问题有什么解决办法呢?我想这是一个非常普遍的情况。我是否只需要记住始终使模拟函数与真实函数保持同步?这似乎是一种非常低效且容易出错的做事方式..?