Javascript单元测试和重构(使用Angularjs框架)

Javascript Unit testing and refactoring (using Angular js framework)

我(作为 js/ng 新手)想知道如何开始我的单元测试之旅以获取以下 angular 代码(具有某些功能的控制器)和必要的模拟?基本上,我想测试 extracted() 函数。将不胜感激美丽的建议。谢谢

    angular.module('HelloWorld')
.controller('myCtrl', function ($scope, firstService, secondService, messageService) {

    'use strict';

    function goWhereTheWindBlows() { // some implementation }

    $scope.mainFun = function(var1) {

        firstService.showSomething(var1, function() {
            var result = secondService.read(var1); 
            // result is the result of http get (200 or 400)
            extracted(result);
        }, goWhereTheWindBlows);

        function extracted(result) {
            result.then(function () {
                messageService.addMessage({ message: 'Success', type: 'standard' });
            }, function () {
                messageService.addMessage({ message: 'Failure', type: 'error' });
            });
        }
    };
 });

使用g运行t-karma进行单元测试。 您的结构中应该有测试文件夹。 用 jasmine 语法为此代码编写单元测试。 使用 beforeEach 来使用控制器所在的 module 。 使用 $controller 函数创建变量并为其分配控制器。 使用控制器和 运行 expect 函数获取变量。 就是这样,运行 g运行t test 看看结果。

Some explantation 关于用 jasmine 语法写作。

对于模拟 http 数据 - 与 $http 服务一起使用的数据,请在 angular 中使用 $httpBackend 服务-mocks.js。 这是假的后端,您可以在其中编写例如获取请求,并使用 whenGET()expect 从中指定答案。还有其他请求,如 POST、PUT。基本上在定义结果期望后,您使用 $httpBackend.flush() 方法刷新更改,因此您将检索数据。

还有端到端测试,您可以使用 selenium webdriver 使用 protractor 执行这些测试,但这些很难与g运行t 测试,因此您可以 运行 所有测试作为两个命令。

请注意,端到端测试不是 jasmine 语法,因此您编写它们的方式不同。