Javascript 当我更改应用程序代码时,我是否必须记住更改测试中的模拟函数?
所以我正在单元测试我的用户类,它调用我的数据库类。所以现在我有这个-Javascript 当我更改应用程序代码时,我是否必须记住更改测试中的模拟函数?,javascript,unit-testing,tdd,Javascript,Unit Testing,Tdd,所以我正在单元测试我的用户类,它调用我的数据库类。所以现在我有这个- User.prototype.getUsername = function() { user = Database.loadUser(1); return user.username; } Database.prototype.loadUser = function(userId) { // Load user data from the database return {
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
};
}
因此,我模拟Database loadUser()函数,以便将用户测试与数据库层隔离。我让mock loadUser()函数返回一个与真实loadUser函数具有相同属性的对象-
MockDatabase.loadUser = function(userId)
return {
username: 'mockUsername',
password: 'mockPassword',
age: 1
};
}
那就好了。现在,假设几天后,我更改了Database 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
};
}
现在,我的用户类仍然在测试期间使用MockDatabase.loadUser()函数作为模拟,并且测试将通过,即使在实际程序运行时会出现异常,因为real Database.loadUser函数不再具有“username”属性
那么这个问题的解决方案是什么呢?我想这是一种非常普遍的情况。我是否需要记住始终保持模拟函数与实际函数同步?这似乎是一种非常低效且容易出错的方法。在更改真实的loadUser函数之前,您应该更新test loadUser函数。测试驱动开发不只是针对代码首次编写时,还针对您随后所做的任何更改这是什么语言?在静态类型语言中,这通常通过定义接口来解决(因此不匹配会导致编译错误)。