编辑:添加了如何使用替换原始示例的HTTP调用存根数据完整示例来单元测试Angular 2/4服务。在我看来,这是优秀的单元测试服务的例子,与官方和第三方指南略有不同。
编辑:重新阅读了官方指南,并在上面的评论中提到@AnteJablanAdamović,指出它应该是
it('should tell ROUTER to navigate when hero clicked',
inject([Router], (router: Router) => {
}));
https://angular.io/guide/testing#the-inject-function
我不确定您是否可以将其包装在fakeasync(为什么不呢?)或异步回调中,但这是我的原始问题的正确答案(为什么没有人发现这个问题并获得50+赏金和10+赞成票?!)。
然而,下面的策略是一种更加清洁/快速的方法,在BeforeEach中包含它,而不是将inject粘贴到每个"it"语句中;
很遗憾Karma或angular没有抛出任何错误或警告标志。
以下是我提供的原始答案,但也可以作为替代方法:
我使用testBet.get在beforeEarch中注入服务:在我看来比大多数指南建议的方法要好得多。
如果您在测试服务时遇到问题,请尝试此指南:涵盖具有依赖关系的简单或复杂服务:
http://www.kirjai.com/testing-angular-services-with-dependencies/
describe('SearchService', () => {
let searchService: SearchService;
let backend: MockBackend;
let setupConnections;
class MockActivatedRoute extends ActivatedRoute {
constructor() {
super();
this.params = Observable.of({ 'searchterm': '*', 'sorttype': 'relevant', 'pagenumber': 1, 'facet': '' });
}
}
const MockRouter = {
navigate: (x) => ({
then: () => ({})
})
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpModule],
providers: [
MockBackend,
BaseRequestOptions,
{
provide: Http,
useFactory: (backend: MockBackend, options: BaseRequestOptions) => new Http(backend, options),
deps: [MockBackend, BaseRequestOptions]
},
AnalyticsService,
{ provide: ActivatedRoute, useClass: MockActivatedRoute },
{
provide: Router,
useValue: MockRouter
},
SearchService
]
});
searchService = TestBed.get(SearchService);
backend = TestBed.get(MockBackend);
你可以像上面设置setupConnections的指南链接中的if语句一样设置路径,但除非你在调用时做了一些不寻常的事情,否则你不需要让路径匹配,所以这是可以的。
setupConnections = (backend: MockBackend, options: any) => {
backend.connections.subscribe((connection: MockConnection) => {
const responseOptions = new ResponseOptions(options);
const response = new Response(responseOptions);
connection.mockRespond(response);
});
};
});
请注意async而不是fakeAsync!!!通常我在组件单元测试中使用fakeAsync很好,但是我在以这种方式对这些服务进行单元测试时遇到了一些错误,结果因人而异。
it('should get suggestions for search drop down and match of mock results for test', async(() => {
console.log('running get Suggestions');
setupConnections(backend, {
body: {
suggestions:
["6-minute walk test",
},
status: 200
});
searchService.getSuggestions('test').subscribe((x) => {
console.log(x);
expect(x).toEqual(['6-minute walk test']);
});
});
it("should build Url String", inject([SearchService], (searchService: SearchService) => {
。 - anteAdamovic