我知道这里已经有一些$state.go
单元测试题,但似乎没有一个对我有用。我有简单的控制器逻辑,它选择一个状态。
if (true) {
$state.go('home.default');
} else {
$state.go('home.new');
}
为了测试哪个州被击中,我尝试了以下方法:
it('should return a state', function () {
spyOn($state, 'go');
$state.go('home.default');
expect($state.go).toHaveBeenCalledWith('home.default');
});
这总是有效的,因为行$state.go('home.default');
基本上使测试变得多余,因为我只是调用我想要的状态然后测试它。我想看看控制器调用哪个状态。
我希望测试是这样的:
it('should return a state', function () {
spyOn($state, 'go');
expect($state.go).toHaveBeenCalledWith('home.default');
});
但这并不起作用,因为即使我知道控制器中有什么建议,它也不会被调用?
答案 0 :(得分:2)
在您的测试文件夹中,使用stateMock
模块创建新文件。复制this gist。
在测试中:
beforeEach(module('stateMock'));
beforeEach(inject(function ($state) {
state = $state;
state.expectTransitionTo('home.default');
}));
it('should return a state', function () {
// something happen and return true and you expect that
// $state.go('home.default') should work
expect(state.current.name).toBe('home.default');
// if it does not happen, expect return false and state.expectTransitionTo return error
});