Angular 指令单元测试:$templateCache 还是 $httpBackend?

Posted

技术标签:

【中文标题】Angular 指令单元测试:$templateCache 还是 $httpBackend?【英文标题】:Angular directive unit testing: $templateCache or $httpBackend? 【发布时间】:2016-04-19 22:00:05 【问题描述】:

我正在测试使用 templateUrl 属性的指令,并且想知道编译模板的最佳方法是什么。使用$templateCache$httpBackend 哪个更好?我猜最好使用$templateCache,因为我认为这是它的用例,但我已经看到它是双向的。虽然我还没有完全使用$httpBackend 方法。

注意:第二次测试是针对原项目的重写。第一个测试来自原始项目。

$templateCache 方式:

describe('buttonToggle', function() 
    var elm, scope;

    beforeEach(module('app'));
    beforeEach(module('src/app/partials/buttonToggle/buttonToggle.html'));

    beforeEach(inject(function($templateCache, _$compile_, _$rootScope_) 
        template = $templateCache.get('src/app/partials/buttonToggle/buttonToggle.html');
        $templateCache.put('src/app/partials/buttonToggle/buttonToggle.html', template);

        $compile = _$compile_;
        $rootScope = _$rootScope_;
    ));

    it('should have an on/off switch', function() 
        var buttonElement = angular.element('<button-toggle></button-toggle>');
        var element = $compile(buttonElement)($rootScope);
        $rootScope.$digest();

        expect(element.text()).toContain('ON');
        expect(element.text()).toContain('OFF');
    );
);

我对@9​​87654328@ 的非工作实现:

describe('The buttonToggle directive', function() 

    var $compile,
        $scope,
        $httpBackend,
        btElement,
        btElementPath = 'client/modules/buttonToggle/buttonToggle.html',
        btElementFileName = 'buttonToggle.html';

    beforeEach(module('app'));

    beforeEach(inject(function(_$compile_, _$rootScope_, _$httpBackend_) 
        $compile = _$compile_;
        $scope = _$rootScope_;
        $httpBackend = _$httpBackend_;
        $httpBackend.whenGET(btElementPath).respond(200);
        $httpBackend.expectGET(btElementFileName).respond(200);
        btElement = $compile('<button-toggle></button-toggle>')($scope);
        $scope.$digest();
    ));

    it('should be defined', function() 
        expect(btElement.html()).toContain('btn');
    );
);

另外,关于如何让后一个测试发挥作用的任何想法?我认为我没有正确设置 whenGET,因为我从断言中得到的错误表明编译的元素为空。

【问题讨论】:

你搞定了吗?我也有同样的问题。Thnx。 【参考方案1】:

其实我从 Angular 文档中找到了一个简短的答案。如果其他人对此主题有很好的了解,请随时回答,但这是我发现的:

如果您的指令使用 templateUrl,请考虑使用 karma-ng-html2js-preprocessor 来预编译 HTML 模板,从而避免在测试执行期间通过 HTTP 加载它们。否则,如果测试目录层次结构与应用程序不同,您可能会遇到问题。

【讨论】:

以上是关于Angular 指令单元测试:$templateCache 还是 $httpBackend?的主要内容,如果未能解决你的问题,请参考以下文章

MutationObserver 上的 Angular 指令单元测试失败:参数 1 不是“节点”类型

如何使用输入对 Angular 指令进行单元测试?

在 Angular 中使用 Jasmine 使用 *ngIf 指令时,如何对元素是不是可见进行单元测试

Angular2如何对自定义验证器指令进行单元测试?

如何在 Angular 2 / 4 中使用鼠标滚轮事件测试指令

模拟指令以测试组件 - Angular 8 与 jasmine 和 Karma