【发布时间】:2026-02-21 22:40:01
【问题描述】:
场景
我已经构建了具有 2 个状态的搜索表单: 第一个状态触发第二个(onclick),并使用 $state.go() 函数设置一些状态参数。 第二个状态有解析函数,获取状态参数,解析搜索结果。
这种方法看起来更简洁,与经典方法相反:在状态一中注入搜索服务,获取结果,将它们保存在搜索服务中,更改状态并从注入的服务加载结果.
问题
如何为此进行单元测试?
最初的想法是我应该做一个“应该用 searchTerm 触发定位并切换到结果页面”的测试。 它失败了,因为状态没有正确解决茉莉花。 有时它在第一个状态下“锁定”,在其他情况下状态始终是“”。
当我从配置中删除解析块时,它按预期工作,并且测试通过,所以问题显然出在解析块中。奇怪的是,我没有收到“未知提供者”错误。
任何想法或想法如何解决这个问题?
关于 * 的最接近的问题是: Angular ui router unit testing (states to urls) 但是用户手动调用状态更改,而在我的场景中它是由另一个函数调用的。
单元测试代码:
describe('SearchController tests', function(){
var ctrl, $state, $rootScope, $httpBackend;
// instantiate the app to provide all the dependencies
beforeEach(module('MyApp'));
beforeEach(inject(function($controller, _$state_, _$rootScope_, _$httpBackend_) {
ctrl = $controller('SearchController', {});
$state = _$state_;
$httpBackend = _$httpBackend_;
$rootScope = _$rootScope_;
// mocking the views
// (instead of including stateMock script from the post, just to simplify)
$httpBackend.expectGET("search.html").respond("<input ng-model='vm.searchTerm'><button ng-click='vm.search()'>Search</button>");
$httpBackend.expectGET("search-results.html").respond("<div ng-repeat='res in vm.results'> {{ res }}</div>");
$state.go('search');
$rootScope.$digest();
}));
it('should trigger a search with searchTerm "rabbit" and change state to search results page', function(){
ctrl.searchTerm = 'rabbit';
$state.go('search');
ctrl.search();
$rootScope.$digest();
expect($state.current.name).toBe('search-results');
})
});
Plunker
【问题讨论】:
标签: angularjs unit-testing angular-ui-router