如何在Karma中测试$ state.go

时间:2015-11-17 15:44:27

标签: angularjs unit-testing state karma-jasmine

我知道这里已经有一些$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');
});

但这并不起作用,因为即使我知道控制器中有什么建议,它也不会被调用?

1 个答案:

答案 0 :(得分:2)

  1. 在您的测试文件夹中,使用stateMock模块创建新文件。复制this gist

  2. 中的代码
  3. 在测试中:

    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
    });