单元测试期待SpyOn未找到

时间:2016-02-26 14:51:54

标签: angularjs unit-testing angularjs-directive jasmine karma-jasmine

我有一个处理事件点击的指令(限制A),并根据值调用服务。

指令:

define(function () {
'use strict';

var myDirective = function ($rootScope, myFactory) {
    return {
        restrict: 'A',
        scope: {
            _myValue : '=value'
        },
        link: function(scope, element, attrs) {
            element.bind('click', function() {
                if (scope._myValue === 'red') {
                    myFactory.red();
                }
                if (scope._myValue === 'green') {
                    myFactory.green();
                }
                if (scope._myValue === 'black') {
                    myFactory.black();
                }
            });
        }
    };
};

return ['$rootScope', 'myFactory', myDirective];
});

测试:

define(['angular-mocks'], function () {
'use strict';

var angular = require('angular');

describe('<-- Directive Spec ------>', function () {

    var scope, $compile, element, myFactory;

    beforeEach(angular.mock.module('myApp'));

    beforeEach(inject(function (_$rootScope_, _$compile_, _myFactory_) {
        scope = _$rootScope_.$new();
        $compile = _$compile_;
        var html = '<div><a my-directive  value="\'red\'"></a></div>';
        myFactory = _myFactory_;
        spyOn(myFactory , 'red').and.callThrough();
        element = $compile(angular.element(html))(scope);
        scope.$digest();

    }));

    it('should be red and call myFactory.red', function () {
        element.click();
        expect(myFactory.red).toHaveBeenCalled();
    });

有了上述内容,我收到错误:

Expected spy red to have been called.

我正在使用Jasmine 2

1 个答案:

答案 0 :(得分:1)

您正在点击<div>,而不是<a>,其中包含指令和事件处理程序。做:

element.find('a').click();

或者只是从已编译的HTML中删除<div>