I am trying to test my angular 4.1.0 component -
export class CellComponent implements OnInit {
lines: Observable>;
@Input() dep
This can be related to Chrome hiding an actual test error. The test area will be confusing some mock http factory that it can't load and therefore that is the error it will report. Most likely the error will be around the ngOnInit area where an object is, say, expecting sub objects and they are not defined.
To try and get to the bottom of the error, switch to PhantomJS temporarily which seems to suffer less from these initialisation errors and this will hopefully report the actual error to you. Several occasions I found to be where an object expected on initialisation wasn't complete. IE:
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
component.object = {}
// should be:
component.object = {"innerObjectThatIsNeeded" : []}
Correcting the object allowed PhantomJS to complete and also Chrome to move on to the next test.
Other than that I've not seen a solution to remove the issue from Chrome. As ever try and adopt a "remove the code, until error goes" policy to chase down the error.
UPDATE: Note this is now a quite an old answer, I wouldn't recommend using PhantomJS anymore (EOL). Browser test reporting has got a lot better and if Chrome is giving you grief then try Firefox, which also runs tests really well nowadays.
You can either set input() property to default value in component.ts
@Input() tableColumns: Array<any> = [];
@Input() pageObj: any = '';
OR
Modify your component.spec.ts file in following way,
beforeEach(() => {
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
component.tableColumns = [];
component.pageObj = '';
fixture.detectChanges();
});
I also had this error, which truth be told is fairly non talkative.
It was related to the HTTP calls trough my services
I use myService.ts with 2 methods
get();
getAll();
I am mocking this service : mockMyService.ts
The error was here because my component was using getAll() method that I forgot to implement in the mockMyService, so I just added the method :
private mockObjects = [
{
'id': '1',
'champ1': 'TECH',
'champ2': 2,
'champ3': 'Data bidon'
},
{
'id': '2',
'champ1': 'TECH',
'champ2': 2,
'champ3': 'Data au pif'
},
{
'id': '3',
'champ1': 'FUNC',
'champ2': 3,
'champ3': 'Data quelconque'
},
];
getAll(): Observable<any> {
return Observable.of(this.mockObjects);
}
Error was gone :)
In my case the culprit was observable.timeout(x).retry(y)
applied somewhere on the returned Observable on the service class level, then again in the component which was using that service.
Everything worked correctly in the browser up until angular-cli 1.4. Then started failing during Karma tests (with such a silly error). The solution was of course to tidy up these timeout/retry operators.
For my case there was a mock data problem and in case of Array
, I was returning string
from the mock.
someApi = fixture.debugElement.injector.get(SomeApi);
spyOn(someApi, 'someMethod')
.and.returnValue(Observable.of('this is not a string but array'));
The error message is really distracting and was not telling the actual error. Running
ng test --source=false
pointed the correct error and line, and helped me to fix it quickly.
Many time it happens when you mock data is incomplete or incorrect.
I had the same issue using angualar cli 6, I have used this tag to get the right error message :
ng test --source-map=false
Maybe it will help someone :) .