使用表达式包装函数的测试指令

时间:2014-01-20 16:25:30

标签: javascript angularjs unit-testing

我必须根据父作用域函数测试一个指令进行初始化:

.directive('droppedSnippet', function () {
    return {
        templateUrl: 'views/dropped-snippet.html',
        restrict: 'E',
        scope: {
            id: '@',
            get: '&'
        },
        link: function postLink(scope, element, attrs) {
            var s = scope.get({id: attrs.id});
            element.find('.title').text(s.title);
        }
    };
});

上下文,如果匆忙则跳过:为了更容易想象(并在需要时讨论整个想法),在drop事件中将此指令添加到文档中。该指令代表嵌入代码。在链接指令期间,仅知道其id,应该从控制器获取其内容并填充其标记。

为了模拟控制器创建的父作用域,我设置了以下模拟:

beforeEach(inject(function ($rootScope, $compile) {
    scope = $rootScope.$new();
    scope.foo = function() {
        return {
            title: 'test title',
            code: 'test <code>'
        };
    };
    spyOn(scope, 'foo').andCallThrough();
    element = angular.element('<dropped-snippet id="3" get="foo(id)"></dropped-snippet>');
    element = $compile(element)(scope);
}));

it('calls the scope function', function() {
    expect(scope.foo).toHaveBeenCalledWith(3);
});

测试失败,未调用scope.foo。代码可以在服务器上运行。我无法找到类似的例子。这是在父作用域中模拟函数的正确方法吗?

1 个答案:

答案 0 :(得分:1)

尝试expect(scope.foo).toHaveBeenCalledWith("3");

或者将其转换为数字,@将其视为字符串