AngularJS 包含 $locationChangeStart 的单元测试控制器

AngularJS unit test controller with $locationChangeStart in it

我是 AngularJS 单元测试的新手。我想用茉莉花测试控制器中的功能。在同一个控制器中还有一个监视 $locationChangeStart

$scope.$on('$locationChangeStart', function(){
    $scope.killTimer($scope.timer);
});

不想测试这个,而是另一个功能。仍然当我尝试 运行 测试时,我得到一个错误,它指向 $scope.$on 行:

TypeError: undefined is not a function

我应该怎么做才能让测试没有运行这一行?我复制了我的测试规范,因为我不确定那里是否一切正常。

describe('invoiceListController', function() {
    beforeEach(module('invoice'));

    var $controller;

    beforeEach(inject(function(_$controller_){
        // The injector unwraps the underscores (_) from around the parameter names when matching
        $controller = _$controller_;
    }));

    var $scope, controller;

    beforeEach(function() {
        $scope = {};
        controller = $controller('invoiceList', { $scope: $scope });
    });

    describe('deleteInvoices()', function(){
        it('should do nothing when no invoice is selected', function() {
            $scope.invoicesToDelete = false;
            var response = $scope.deleteInvoices();
            expect(response).toEqual(false);
        });
    });
});

以及我要测试的代码:

$scope.deleteInvoices = function(){
    if($scope.invoicesToDelete) {
        return true;
    } else {
        return false;
    }
};

Plunker 中的示例:Plunker

您目前的测试实际上不会 运行 通过范围,因为您需要在设置和 运行 宁范围功能后 $apply 。不过,这不会解决您未定义的问题,请检查您编写的函数是否可用于您的测试($scope.killTimer)。可能是 killTimer 函数中的某些东西出错了。

it('should do nothing when no invoice is selected', function() {
            $scope.invoicesToDelete = false;
            var response = $scope.deleteInvoices();

            $scope.$apply();
            expect(response).toEqual(false);
        });

更新 在查看您的 plunkr 之后,实际上是您在测试中的范围实现是错误的,通过修复此问题,整个测试用例按预期工作。

$scope = $rootScope.$new();

是您应该注入控制器以正确实现范围的内容。我在这里更新了你的 plunker。 http://plnkr.co/edit/p3LShkxT12B1qw7fNbEb?p=preview