I have the following service:
import { Injectable } from '@angular/core';
import { MenuItem } from './../classes/menu-item';
import { ITEMS } from './../static-data/items-list';
@Injectable()
export class ItemsListService {
getItems(): Promise<MenuItem[]> {
return Promise.resolve(ITEMS);
}
}
The test for this service is here:
import { TestBed, async, inject } from '@angular/core/testing';
import { ItemListService } from './item-list.service';
import { MenuItem } from './../classes/menu-item';
import { ITEMS } from './../static-data/items-list';
describe('ItemListService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [ ItemListService, MenuItem, ITEMS ]
});
});
it('should ...', inject([ItemListService], (service: ItemListService) => {
expect(service).toBeTruthy();
}));
});
The MenuItem is defined here:
export class MenuItem {
name: string;
link: string;
}
ITEMS is defined here: import { MenuItem } from './../classes/menu-item';
export var ITEMS: MenuItem[] = [
{name: 'Vehicles', link: '/vehicles'},
{name: 'Gateways', link: '/gateways'},
{name: 'Statuses', link: '/statuses'},
{name: 'Logs', link: '/logs'}
]
When I run the test I am getting in the browsers console the followings errors:
FAILED ItemListService should ...
and
So why do I have these errors? And what is the solution for the test to work?
This is such an annoying error, thought I'd include another subtle cause to look for in your spec. In my case I specified 'provider' instead of 'provide' as below
TestBed.configureTestingModule({
providers: [{provider: ApplicationActions, useClass: ActionMock}] // don't do that (missing 'provide')!
rather than offer useful information like "no 'provide' key specified" it simply reports
Failed: Invalid provider for the NgModule 'DynamicTestModule' - only instances of Provider and Type are allowed, got: [?[object Object]?, ...]
BTW also mind to use the class in providers, not some variable. This happened to me due to an accidental problematic replacement/casing:
TestBed.configureTestingModule({
// ...
providers: [ SomeService ]
}
instead of...
TestBed.configureTestingModule({
// ...
providers: [ someService ]
}
Note the camelCase variable ( someService
) is likely there if you use it in your test, that's why it does not throw a syntax error.
I have same problem, when importing in my Ionic Framework
project like this:
import {Device} from '@ionic-native/device'
instead of:
import {Device} from '@ionic-native/device/ngx'
In my case, I had a stray comma in one of my provider lines, causing the DynamicTestModule
to think I had passed an undefined
definition.
{
provide: ApiService,
useValue: {
getUsers: jasmine
.createSpy('getUsers')
.and.returnValue(of({ status: 200, body: [] })),
},
},
, // whoops!
MessageService,
{ provide: Location, useValue: { back: jasmine.createSpy('back') } },
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.