单元测试 - 方法中的模拟方法?

时间:2015-12-09 15:05:40

标签: javascript node.js unit-testing testing

我正在为Node.js应用程序编写单元测试,我想知道我是否在嘲笑代码的正确部分。

以下示例是一个假设类,它有两个静态方法。

方法isTokenValid调用另一个方法decodeToken,它接受​​令牌和回调。回调是在isTokenValid内定义的。这两种方法都属于同一类。

单元测试isTokenValid时,我的方法是模拟decodeToken方法。

我很清楚,在进行单元测试时,应该嘲笑这种AJAX请求的依赖关系。但是,这种依赖性是否也适用,或者我过于细化?

正在嘲笑decodeToken正确的单元测试方法isTokenValid

var TokenClass = {};

TokenClass.isTokenValid(token) {
    TokenClass.decodeToken(token, function(err, decoded) {
            if (err) {
                console.log('There was a validation error');
            }
            if (decoded) {
                return true
            };
        }
    }

    TokenClass.decodeToken(token, callback) {
        // some logic here to decode token
        if (err) {
            return callback(err);
        }
        // if token is not valid
        if (!validToken) {
            return callback(null, undefined);
        }
        // if token is valid
        return callback(null, decoded);
    }
}

1 个答案:

答案 0 :(得分:0)

有两种方法。

在经典单元测试中,您可以模拟测试单元外部的所有内容 - 在这种情况下,isTokenValid方法是您的单位。但这种方法并不实用。

最好的方法是模拟不会让你的测试以孤立和确定的方式运行的事情(每次都是相同的结果)。

如果decodeToken没有调用任何外部资源(网址,数据库,文件系统),那么你就不必嘲笑它了。但是,如果它确实调用外部资源,那么decodeToken应该在另一个对象中实现,即TokenDecoder并注入TokenValidator,然后对TokenValidator进行单元测试,你可以注入模拟TokenDecoder没有调用任何外部资源。

TokenDecoder然后应该使用集成测试进行测试,但那是另一个主题。