gpt4 book ai didi

angularjs - 如何在指令中对 $emit 进行单元测试?

转载 作者:行者123 更新时间:2023-12-02 22:20:12 24 4
gpt4 key购买 nike

如何检查 $emit 是否已在指令的单元测试中被调用?

我的指令相当简单(出于说明目的):

angular.module('plunker', [])
.directive('uiList', [function () {
return {
scope: {
lengthModel: '=uiList',
},
link: function (scope, elm, attrs) {
scope.$watch('lengthModel', function (newVal) {
scope.$emit('yolo');
});
}
}
}])

因此每次属性 uiList 发生更改时,它都会发出该事件。

我的单元测试代码如下:

describe('Testing $emit in directive', function() {
var scope;
var element;


//you need to indicate your module in a test
beforeEach(function () {
module('plunker');
inject(function ($rootScope, $compile) {
scope = $rootScope.$new();
scope.row= 1;
spyOn(scope,'$emit');
element = angular.element('<ul id="rows" ui-list="row">');
$compile(element)(scope);
});
});

it('should emit', function() {

scope.$digest();
scope.row = 2;
scope.$digest();
expect(scope.$emit).toHaveBeenCalledWith("yolo");
});
});

这总是会给我错误,指出从未调用过scope.$emit。范围有问题吗?有人可以帮忙吗?

骗子:http://plnkr.co/edit/AqhPwp?p=preview

最佳答案

你的指令创建了一个独立的作用域,它正在调用$emit,所以你需要监视这个作用域;)

describe('Testing $emit in directive', function() {
var scope;
var element;
var elementScope;

beforeEach(module('plunker'));

beforeEach(inject(function($rootScope, $compile) {
scope = $rootScope.$new();
scope.row = 1;
element = angular.element('<ul id="rows" ui-list="row">');
$compile(element)(scope);
scope.$digest();
elementScope = element.scope();
}));

it('should emit', function() {
// arrange
spyOn(elementScope, '$emit');

// act
scope.$apply(function() {
scope.row = 2;
});

// assert
expect(elementScope.$emit).toHaveBeenCalledWith("yolo");
});
});

Fixed plunker here :)

关于angularjs - 如何在指令中对 $emit 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25148426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com