如何对Angular 1.5 Component模板进行单元测试?

时间:2017-01-12 22:17:50

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

所以,这是我的测试:

describe('My Test', function(){

  var $componentController, $compile, controller, scope;

  beforeEach(inject(function($injector, $rootScope, $templateCache){

    $templateCache.put('my-component.html', '<h1>{{ $ctrl.foo }}</h1>');

    $componentController = $injector.get('$componentController');

    var bindings = {
      foo: 'A Foo'
      };

    scope = $rootScope.$new();

    controller = $componentController('myComponent', { $scope: {} }, bindings);

    }));

  it('should render the correct html', function(){

    scope.foo = 'Changed Foo';

    var element = angular.element(
      '<my-component foo="Original Foo"></my-component>'
      );

    var template = $compile(element)(scope);

    scope.$digest();

    var templateAsHtml = template.html();

    console.log(templateAsHtml);

    };

}

我得到的是&#34; Original Foo&#34; ,而不是&#34;更改了Foo&#34; 。因此,即使我在测试中更改scope.foo变量,它也会使用组件(或控制器)上的变量。

所以关于如何在测试中更改组件变量的任何想法,所以当我编译模板时它会捕获这些更改。

基本上我想要的是能够访问和修改控制器变量,因此我可以根据控制器变量值测试某些输出。这有意义吗?

1 个答案:

答案 0 :(得分:4)

scope.foo不会影响组件绑定。 foo范围属性不是foo属性。

这可能应该像

一样进行测试
var component = $compile('<my-component foo="{{ foo }}">')(scope);

scope.$digest();

var componentScope = component.isolateScope();

expect(component.html())...
expect(componentScope.$ctrl.foo)...