oli*_*son 5 javascript unit-testing mocha.js node.js sinon
我一直在构建一个节点模块,它包含了对GitHub API的一些调用,并且我无限的智慧使用了揭示模块模式构建了它,保持我的包装函数是私有的,只暴露了简单的方法.请参阅以下示例:
github.shortcuts = (function(){
var appPath;
var createRepo = function(name){
var deferred = Q.defer();
github.repos.create({
name: name,
auto_init: true
}, function(error, result){
if (error) {
deferred.reject(new Error(error));
} else {
deferred.resolve(result);
}
});
return deferred.promise;
};
var updateRef = function(result){
var deferred = Q.defer();
var user = result.user;
var repo = result.repo;
github.gitdata.updateReference({
user: user,
repo: repo,
ref: 'heads/master',
sha: result.sha
}, function(error, result){
if (error) {
deferred.reject(new Error(error));
} else {
deferred.resolve(result);
}
});
return deferred.promise;
};
return {
init: function(token, name, path){
var deferred = Q.defer();
appPath = path;
var error = function(error){
return deferred.reject(error);
};
github.authenticate({
type: "oauth",
token: token
});
createRepo(name)
.then(updateRef, error)
.then(function(result){
deferred.resolve(result);
}, error);
return deferred.promise;
}
};
})();
Run Code Online (Sandbox Code Playgroud)
但是,为此编写单元测试会导致我的问题.我不想测试我的私有函数,只是公共函数,init()但是我想要保存私有函数,以便测试不会调用GitHub API.我正在使用Mocha和Chai进行测试,使用Sinon进行我的spys/stubs.
关于如何存根这些函数的任何建议或者如果这是一个糟糕的模式,我将如何测试这个模块将不胜感激!
您应该隔离类中有问题的部分并将其模拟出来,而不是将私有方法存根.模拟或存根私有方法的需要是设计气味,IMO,表明该类太大,您应该分离各种问题.
在这种情况下,您可以将githubAPI作为参数传递给init,而不是通过类的内部挖掘,只需提供一个返回静态结果的假API.
当您开始测试错误情况时,这尤其有用,因为您的模拟API可以抛出相应的错误并允许您仅测试错误处理行为.
实际上,您有很多非常合理的理由想要排除一个私有函数。就像其中包含许多逻辑,而您只想测试该逻辑。要像as any对待其他任何函数一样对所有私有函数进行存根,然后将其附加到父对象:
规格:
startTimeoutTimerSpy = spyOn(service as any, 'startTimeoutTimer');
Run Code Online (Sandbox Code Playgroud)
服务具有私有功能startTimeoutTimer。将附加as any到服务对象会告诉TypeScript忽略任何类型,而只是假设您可以做到。