Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

Context

I created an ApiService class to be able to handle our custom API queries, while using our own serializer + other features.

ApiService's constructor signature is:

constructor(metaManager: MetaManager, connector: ApiConnectorService, eventDispatcher: EventDispatcher); 
  • MetaManager is an injectable service that handles api's metadatas.
  • ApiConnectorService is a service which is wrapping Http to add our custom headers and signature system.
  • EventDispatcher is basically Symfony's event dispatcher system, in typescript.

Problem

When I test the ApiService, I do an initialization in beforeEach:

beforeEach(async(() => {     TestBed.configureTestingModule({         imports  : [             HttpModule         ],         providers: [             ApiConnectorService,             ApiService,             MetaManager,             EventDispatcher,             OFF_LOGGER_PROVIDERS         ]     }); })); 

and it works fine.

Then I add my second spec file, which is for ApiConnectorService, with this beforeEach:

beforeEach(async(() => {     TestBed.configureTestingModule({         imports  : [HttpModule],         providers: [             ApiConnectorService,             OFF_LOGGER_PROVIDERS,             AuthenticationManager,             EventDispatcher         ]     }); })); 

And all the tests fail with this error:

Error: Can't resolve all parameters for ApiService: (MetaManager, ?, EventDispatcher).

  • If I remove api-connector-service.spec.ts (ApiConnectorService's spec file) from my loaded tests, ApiService's tests will succeed.
  • If I remove api-service.spec.ts (ApiService's spec file) from my loaded tests, ApiConnectorService's tests will succeed.

Why do I have this error? It seems like the context between my two files are in conflict and I don't know why and how to fix this.

like image 705
Supamiu Avatar asked Sep 13 '16 14:09

Supamiu


People also ask

Why can't I resolve all parameters for mycomponent?

Then you could get an error like EXCEPTION: Can't resolve all parameters for MyComponent: (?). The same error can happen due to a circular dependency which causes an undefined service import.

How to resolve'can't resolve all parameters for router?

'Can't resolve all parameters for Router: (?, ?, ?, ?, ?, ?, ?)' Fortunately resolving this particular error is fairly straightforward as we have 2 available solutions to choose from... The first approach to fixing this issue is to simply create a mock class that simulates the Angular Router module and its methods.

Why am I getting this jest error when trying to test angular?

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:


1 Answers

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 ("emitDecoratorMetadata":true). 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"   ] } 
like image 194
Mike Dalrymple Avatar answered Oct 02 '22 19:10

Mike Dalrymple