我有一个触发更改页面的功能。我怎么能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');
}));
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');
}));
答案 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');
});