我正在为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);
}
}
答案 0 :(得分:0)
有两种方法。
在经典单元测试中,您可以模拟测试单元外部的所有内容 - 在这种情况下,isTokenValid
方法是您的单位。但这种方法并不实用。
最好的方法是模拟不会让你的测试以孤立和确定的方式运行的事情(每次都是相同的结果)。
如果decodeToken
没有调用任何外部资源(网址,数据库,文件系统),那么你就不必嘲笑它了。但是,如果它确实调用外部资源,那么decodeToken
应该在另一个对象中实现,即TokenDecoder
并注入TokenValidator
,然后对TokenValidator
进行单元测试,你可以注入模拟TokenDecoder
没有调用任何外部资源。
TokenDecoder
然后应该使用集成测试进行测试,但那是另一个主题。