我已经为构造函数添加了一些代码,现在我的单元测试失败了。新代码从可观察的对象this.isFollowOnMode
设置为true或false:
import { CustomerGroupService } from 'customerGroup.service';
class HeaderBarController {
private isFollowOnMode: boolean;
constructor(private customerGroupService: CustomerGroupService) {
'ngInject';
//new code that is causing test to fail:
this.customerGroupService.isFollowOnMode$ // will be true or false
.subscribe((isFollowOnMode) => {
this.isFollowOnMode = isFollowOnMode;
});
}
// other stuff
}
export default HeaderBarController;
我的单元测试中出现以下错误:
PhantomJS 2.1.1(Mac OS X 0.0.0)控制器:HeaderBarController应定义为FAILED TypeError:undefined不是构造函数(评估' this.customerGroupService.isFollowOnMode $'
这是我失败的单元测试:
describe('Controller: HeaderBarController', function () {
beforeEach(angular.mock.module(module.name));
beforeEach(angular.mock.module(function ($provide) {
$provide.service('customerGroupService', () => { });
}));
beforeEach(inject(function ($rootScope, $componentController) {
this.$scope = $rootScope.$new();
this.ctrl = $componentController('headerBar',
{
// locals
$scope: this.$scope,
$element: [{}],
$attrs: [],
},
{
// scope bindings
}
);
}));
it('should be defined', function () {
expect(this.ctrl).toBeDefined();
});
});
所以我似乎没有设置this.customerGroupService.isFollowOnMode$
。它的默认值应为false。在单元测试中。我是单元测试的新手,所以任何帮助都会很棒。感谢。
答案 0 :(得分:1)
问题不是特定于可观察对象,而是适用于一般的服务存根。
此
$provide.service('customerGroupService', () => {});
将导致服务没有预期的属性,使用箭头而不是构造函数也是错误的。
ngMock已经提供了一种模拟服务的方法:
let customerGroupServiceMock;
beforeEach(() => {
customerGroupServiceMock = {
isFollowOnMode$: Observable.of(true);
};
angular.mock.module({ customerGroupService: customerGroupServiceMock });
});
也可以直接将模拟服务注入控制器,而不是在注入器中定义它们:
this.ctrl = $componentController('headerBar',
{
// locals
customerGroupService: customerGroupServiceMock,
$scope: this.$scope,
$element: [{}],
$attrs: [],
},
这正是'本地人'的意思。