gpt4 book ai didi

javascript - Jasmine + AngularJS : How to test $rootScope. $broadcast 被调用参数?

转载 作者:数据小太阳 更新时间:2023-10-29 04:05:18 27 4
gpt4 key购买 nike

我正在尝试编写一个单元测试来验证是否调用了 $rootScope.$broadcast('myApiPlay', { action : 'play' });

这是 myapi.js

angular.module('myApp').factory('MyApi', function ($rootScope) {
var api = {};
api.play = function() {
$rootScope.$broadcast('myApiPlay', { action : 'play' });
}
return api;
});

这是我的单元测试:

describe('Service: MyApi', function () {

// load the service's module
beforeEach(module('myApp'));

// instantiate service
var MyApi;
var rootScope;

beforeEach(function () {
inject(function ($rootScope, _MyApi_) {
MyApi = _MyApi_;
rootScope = $rootScope.$new();
})
});
it('should broadcast to play', function () {
spyOn(rootScope, '$broadcast').andCallThrough();
rootScope.$on('myApiPlay', function (event, data) {
expect(data.action).toBe('play');
});
MyApi.play();
expect(rootScope.$broadcast).toHaveBeenCalledWith('myApiPlay');
});
});

这是我在运行 grunt test 时遇到的错误:

PhantomJS 1.9.7 (Windows 7) Service: MyApi should broadcast to pause FAILED
Expected spy $broadcast to have been called with [ 'myApiPlay' ] but it was never called.

我也尝试过使用 expect(rootScope.$broadcast).toHaveBeenCalled() 我遇到了类似的错误:Expected spy $broadcast to have been called. .

我想验证是否确实使用正确的参数调用了该方法。

谢谢!

最佳答案

你的测试没有通过的原因是你在监视错误的 $broadcast 函数。在您的 beforeEach 设置中,您要求注入(inject) $rootScope,然后通过调用 $rootScope.$new() 创建一个子作用域。

$rootScope.$new() 的返回值不再是 rootScope,而是根范围的子级。

beforeEach(function () {
//inject $rootScope
inject(function ($rootScope, _MyApi_) {
MyApi = _MyApi_;
//create a new child scope and call it root scope
rootScope = $rootScope.$new();
//instead don't create a child scope and keep a reference to the actual rootScope
rootScope = $rootScope;
})
});

在您的 play 函数中,您在 $rootScope 上调用 $broadcast,但在您的测试中,您正在监视 $rootScope 的子级。

$rootScope.$broadcast('myApiPlay', { action : 'play' });

所以总结一下,删除对 $rootScope.$new() 的调用,只监视注入(inject)器给你的 $rootScope 。提供给单元测试的 $rootScope 与提供给 API 服务的 $rootScope 相同,因此您应该直接监视 $rootScope。

查看 plunkr http://plnkr.co/edit/wN0m8no2FlKf3BZKjC4k?p=preview

关于javascript - Jasmine + AngularJS : How to test $rootScope. $broadcast 被调用参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25817534/

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