Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我更改应用程序代码时,我是否必须记住更改测试中的模拟函数?_Javascript_Unit Testing_Tdd - Fatal编程技术网

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函数。测试驱动开发不只是针对代码首次编写时,还针对您随后所做的任何更改

这是什么语言?在静态类型语言中,这通常通过定义接口来解决(因此不匹配会导致编译错误)。