Angularjs 哪种方法最适合对组合代码进行单元测试?
假设我有以下AngularJs服务:Angularjs 哪种方法最适合对组合代码进行单元测试?,angularjs,unit-testing,Angularjs,Unit Testing,假设我有以下AngularJs服务: angular.module("foo") .service("fooService", function(){ var svc = this; svc.get = function(id){...}; svc.build = function(id){...}; svc.save = function(thing){...}; //posts, then returns the sa
angular.module("foo")
.service("fooService", function(){
var svc = this;
svc.get = function(id){...};
svc.build = function(id){...};
svc.save = function(thing){...}; //posts, then returns the saved thing
svc.getOrCreate = function(id){
return svc.get(id).then(function(thing){
return thing || svc.build(id).then(function(builtThing){
return svc.save(builtThing);
});
});
}
});
通过确保使用正确的数据到达正确的API端点,我可以对get
方法进行单元测试
我可以测试build
方法,方法是确保它从适当的端点/服务提取数据并构建它应该构建的内容
我可以通过确保到达正确的API端点来测试save
方法
我应该如何测试getOrCreate
方法?对此,我有两种不同的看法:
get
、build
和save
方法,并在适当的时候使用适当的参数验证它们是否被调用get
和build
中调用的API端点,然后验证save
中的端点是否使用正确的参数调用get
、build
和save
方法的实现方式,但它并不完全正确,因为它是在测试实现而不是行为。然而,选项2要求我在多个测试区域中验证这些其他方法的行为,这似乎更脆弱,脆弱的测试使人们讨厌编程
这是我发现自己在测试中经常面临的一个常见权衡。。。有人对如何处理这件事有什么建议吗?我看到这两种方法都有,而且两种方法都没有强烈的偏好。然而,我个人会考虑选项1,在那里你不嘲笑其他测试的其他功能是集成测试,因为他们调用多个公开可见的函数,因此倾向于选项2。 < P>这将归结为一个观点。p> 如果您正在进行单元测试,那么您的测试应该针对非常特定的功能 如果你开始追逐承诺,你有承诺链,它会在哪里停止 最重要的是,随着单元测试范围越来越大,它所依赖的东西越来越多(服务、API等),它可以使用更多的方式来阻止,而这些方式可能与“单元”无关。这正是你想要确保的工作 问题:如果您有一个与模板配合良好的可靠控制器,以及一个确保控制器坚如磐石的单元测试。从web服务http API调用响应解析的两次分离的承诺是否应该破坏控制器测试
另一方面,与通过模拟服务来测试API客户端端点的方法相同,您可以使用Angular的服务之类的东西使用自己的测试来测试服务。我想我倾向于模拟
$httpBackend
的getOrCreate
方法,但是如果控制器正在使用此服务,然后我会很明显地模拟服务,而不是模拟底层http调用。听起来怎么样?听起来像是DMac计划。这是我通常做的事。这是我自己的存根方式,它使单元测试更加健壮,不易损坏。我有足够的代码维护要做。我希望将测试维护保持在最低限度。