【发布时间】:2013-07-02 18:24:44
【问题描述】:
所以我正在对调用我的数据库类的用户类进行单元测试。所以目前我有这个-
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 函数不再有一个“用户名”属性。
那么解决这个问题的方法是什么?我想这是一个非常普遍的情况。我是否只需要记住始终保持模拟函数与真实函数同步?这似乎是一种非常低效且容易出错的做事方式..?
【问题讨论】:
-
这是什么语言?在静态类型语言中,这通常通过定义接口来解决(因此不匹配会导致编译错误)。
标签: javascript unit-testing tdd