单元测试函数中的$ state

时间:2016-01-14 09:10:09

标签: angularjs unit-testing

我有一个触发更改页面的功能。我怎么能unit test这个?我总是得到一个失败的结果:

  

预期' '要添加'

所以当前的州名仍然是主页

功能

$scope.goToAddVote = function(){
  $state.go('add');
}

单元测试

    it('should redirect index.html to add.html after click on button', inject(function($state) {
    scope.goToAddVote();
    $state.go('add');
    expect($state.current.name).toBe('add');
}));

编辑:使用Nilo的回答

    var mockStateService = {
    go: jasmine.createSpy('add')
};


it('should redirect index.html to add.html after click on button', inject(function($state) {
    scope.goToAddVote();
    $state.go('add');
    expect(mockStateService.go).toHaveBeenCalledWith('add');
}));

1 个答案:

答案 0 :(得分:0)

您的单元测试失败,因为您尝试接收的状态从未首先注册。这就是为什么go函数没有效果,结果在你当前的状态名称为''

你应该做的是注入$ state服务的模拟,用jasmine-spy代替go-function。在你的断言中,你希望这个函数被调用。

这在单元测试方面更为清晰,因为您还没有测试$ state的功能。

模拟服务看起来像这样:

var mockStateService = {
    go: jasmine.createSpy()
}

然后断言应如下所示:

expect(mockStateService.go).toHaveBeenCalledWith('add');
编辑:您的结果也可能是由Pankaj Parkar提到的事实引起的。所以你也可以尝试,但要么你应该模拟服务,所以你真的只测试你自己编写的代码。

EDIT2:您没有注入模拟服务,但仍使用原始$ state

var mockStateService,
    myScope,
    ctrl;

beforeEach(inject(function($controller, $rootScope) {
    mockStateService = {
        go: jasmine.createSpy()
    }
    myScope = $rootScope.$new();
    ctrl = $controller('myController', {
        $scope: myScope,
        $state: mockStateService
    });
}));

// tip: write better descriptions, what you are writing is not what's really happening
it('should redirect index.html to add.html after click on button', function() {
    myScope.goToAddVote();
    expect(mockStateService.go).toHaveBeenCalledWith('add');
});