Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 哪种方法最适合对组合代码进行单元测试?_Angularjs_Unit Testing - Fatal编程技术网

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

假设我有以下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 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
    中的端点是否使用正确的参数调用
  • 第一种方法基本上是说,“我知道这三种方法是有效的,因为它们是经过独立测试的。我不关心它们实际上是如何工作的,但我关心它们在这个方法中被调用。”

    第二种方法是说,“我不关心这个方法在内部是如何工作的,只关心到达了正确的API端点”

    以下哪种方法更“正确”?我觉得第一种方法不那么脆弱,因为它独立于
    get
    build
    save
    方法的实现方式,但它并不完全正确,因为它是在测试实现而不是行为。然而,选项2要求我在多个测试区域中验证这些其他方法的行为,这似乎更脆弱,脆弱的测试使人们讨厌编程


    这是我发现自己在测试中经常面临的一个常见权衡。。。有人对如何处理这件事有什么建议吗?

    我看到这两种方法都有,而且两种方法都没有强烈的偏好。然而,我个人会考虑选项1,在那里你不嘲笑其他测试的其他功能是集成测试,因为他们调用多个公开可见的函数,因此倾向于选项2。

    < P>这将归结为一个观点。p> 如果您正在进行单元测试,那么您的测试应该针对非常特定的功能

    如果你开始追逐承诺,你有承诺链,它会在哪里停止

    最重要的是,随着单元测试范围越来越大,它所依赖的东西越来越多(服务、API等),它可以使用更多的方式来阻止,而这些方式可能与“单元”无关。这正是你想要确保的工作

    问题:如果您有一个与模板配合良好的可靠控制器,以及一个确保控制器坚如磐石的单元测试。从web服务http API调用响应解析的两次分离的承诺是否应该破坏控制器测试


    另一方面,与通过模拟服务来测试API客户端端点的方法相同,您可以使用Angular的服务之类的东西使用自己的测试来测试服务。

    我想我倾向于模拟
    $httpBackend
    getOrCreate
    方法,但是如果控制器正在使用此服务,然后我会很明显地模拟服务,而不是模拟底层http调用。听起来怎么样?听起来像是DMac计划。这是我通常做的事。这是我自己的存根方式,它使单元测试更加健壮,不易损坏。我有足够的代码维护要做。我希望将测试维护保持在最低限度。