简体   繁体   中英

Invalid provider for the NgModule 'DynamicTestModule' when testing a service in Angular 2

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:

Correct

 TestBed.configureTestingModule({
    // ...
    providers: [ SomeService ]
}

instead of...

Incorrect

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM