typescript - Mocking en tjeneste i Angular Karma Jasmine testing


Jeg prøver å mocke en tjeneste ved å legge den til i providers-arrayet i spesifikasjonen og legge til createSpyObj med dens funksjoner, men jeg får følgende feil:

Tilgang til XMLHttpRequest på ''ng://DynamicTestModule/mycomponent_Host.ngfactory.js'' fra opprinnelse 'http:localhost:9876'

hva gjør jeg galt?

// .... importer tjenesten

mockService = jasmine.createSpyObj(['function1'])
testBed.configureTestingModule({
  providers:[{
      {provide: myService, useValue: mockService}
  }]
}).compileComponents()

Svar #1

Måten du har opprettet spy på er feil. Fra feilen ser det ut til å være mer relatert til ugyldig import eller noe annet.

Den riktige måten å gjøre dette på er:

describe("UserDetailComponent", () => {
  let component: UserDetailComponent;
  let fixture: ComponentFixture<UserDetailComponent>;
  const mockUserService = jasmine.createSpyObj("UserSvcService", ["getUserDetail"]);

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [UserDetailComponent],
      providers: [
        { provide: UserSvcService, useValue: mockUserService }
      ]
    }).compileComponents();
  }));
....
...
 it('should set some values using service',()=>{
   mockUserService.getUserDetail.and.returnValue(
      of({ data: 'somevalue'})
    );
   expect(someCondition).toBeDefined();
 })
)}

Det finnes andre måter å gjøre dette på, ved å bruke Stubs og sette dem inn i komponenten ved å bruke useClass. Du kan referere til denne artikkelen av meg for å få ideen

Svar #2

la oss bare si at du har en tjeneste som heter SharedService for å teste

// import the service from the desired location, i just indicated with @
import { SharedService } from "@services"

// create an instance inside describe
let sharedService: SharedService

// declare under providers in beforeEach
providers: [SharedService]

// create component and test fixture
fixture = TestBed.createComponent(yourComponentName);
component = fixture.componentInstance;
sharedService = fixture.debugElement.injector.get(SharedService)

// use compileComponents only if you are not using webpack or angular CLI 

it('Should call MethodOne - sharedService ==> resolved', () => {
        let MockedData = {};
        spyOn(sharedService, 'someMethod').and.returnValue(Observable.of(MockedData));
        component.MethodOne();
        expect(sharedService.someMethod).toHaveBeenCalled();
    });

Relaterte artikler