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();
});
