【问题标题】:When I change my application code do I have to remember to change the mocked functions in my tests?当我更改我的应用程序代码时,我是否必须记住更改测试中的模拟函数?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-08
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2022-06-26
    • 2016-05-19
    • 2018-08-31
    相关资源
    最近更新 更多