如何在Angular单元测试中从指令而不是控制器模拟作用域

4

我熟悉使用$controller构造函数来模拟$scope和控制器的概念。

var scope = rootScope.$new();
it('should contain a testVar value at "test var home"', function(){
    homeCtrl = $controller('homeCtrl', {
        $scope: homeScope,
        $rootScope: rootScope
    })

    expect(homeScope.testVar).toBe('test var home');
})

有没有一种类似的方法来模拟指令(directive)?无论是指令还是它的控制器都可以。
//mock coding
var scope = rootScope.$new();
it('should contain a testVar value at "test var home"', function(){
    homeDir = $directive('homeCtrl', {
        $scope: homeScope,
        $elem: angular.element('<div....</div>'),
        $att: {}
        $modelViewController: angular.element().controller('ngModel')
    })
            homeCtrl = homeDir.$getController();
    expect(homeScope.testVar).toBe('test var home');
})

问题旨在针对指令,如何测试它们?如何提取它们的组件?据我所知,如果我在指令上有一个函数,我需要将其附加到作用域上,否则,如果它属于指令,则该函数是无法测试的。因此,如果我想在测试期间使用作用域,如何将作用域注入变量中?

1个回答

6
我设置指令规范的方法是:
beforeEach(inject(function($rootScope, $compile) {
    var htmlString = '' +
        '<my-directive some-attr="value">' +
        '</my-directive>'
        ;
    element = angular.element(htmlString)
    scope = $rootScope.$new();
    $compile(element)(scope);
    scope.$digest();
}));

基本上,我编写了一个声明指令的HTML字符串,并使用注入的作用域运行结果函数。然后,我使用JQuery(或JQueryLite)与元素交互或直接在作用域上进行断言。


谢谢,我昨晚测试了一下,它起作用了,但还是谢谢。 - user2167582
如果您有一个没有templateUrl的文件,那么获取作用域是否需要额外的功能? - Winnemucca
我不确定我理解了那个问题。 - ivarni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接