Testing - Can't resolve all parameters for (ClassName) Testing - Can't resolve all parameters for (ClassName) angular angular

Testing - Can't resolve all parameters for (ClassName)


Using Jest?

In case anyone gets here AND you're using Jest to test your Angular app (hopefully we're a growing minority), you will run into this error if you are not emitting decorators. You'll need to update your tsconfig.spec.json file so it looks like:

{  "extends": "../../tsconfig.json",  "compilerOptions": {    "emitDecoratorMetadata": true,    "outDir": "../../out-tsc/spec",    "types": [      "jest",      "node"    ]  },  "files": [  ],  "include": [    "**/*.spec.ts",    "**/*.d.ts"  ]}


It's because the Http service can't be resolved from the HttpModule, in a test environment. It is dependent on the platform browser. You shouldn't even be trying to to make XHR calls anyway during the tests.

For this reason, Angular provides a MockBackend for the Http service to use. We use this mock backend to subscribe to connections in our tests, and we can mock the response when each connection is made.

Here is a short complete example you can work off of

import { Injectable } from '@angular/core';import { async, inject, TestBed } from '@angular/core/testing';import { MockBackend, MockConnection } from '@angular/http/testing';import {  Http, HttpModule, XHRBackend, ResponseOptions,  Response, BaseRequestOptions} from '@angular/http';@Injectable()class SomeService {  constructor(private _http: Http) {}  getSomething(url) {	return this._http.get(url).map(res => res.text());  }}describe('service: SomeService', () => {  beforeEach(() => {	TestBed.configureTestingModule({	  providers: [		{		  provide: Http, useFactory: (backend, options) => {			return new Http(backend, options);		  },		  deps: [MockBackend, BaseRequestOptions]		},		MockBackend,		BaseRequestOptions,		SomeService	  ]	});  });  it('should get value',	async(inject([SomeService, MockBackend],				 (service: SomeService, backend: MockBackend) => {	backend.connections.subscribe((conn: MockConnection) => {	  const options: ResponseOptions = new ResponseOptions({body: 'hello'});	  conn.mockRespond(new Response(options));	});	service.getSomething('http://dummy.com').subscribe(res => {	  console.log('subcription called');	  expect(res).toEqual('hello');	});  })));});