服务未定义的jasmine测试



测试一个需要订阅服务的组件,但jasmine测试总是失败

我将服务记录到控制台并使用返回成功的expect(contactService).toBeDefined()

但一旦我订阅,它就会返回未定义的

规格:

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { ContactComponent } from './contact.component';
import { DivPositionsService } from '../../../services/div-positions.service';
import { ContactService } from '../../../services/contact.service';
import { HttpClientModule } from '@angular/common/http';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { Email } from '../../../models/email.model';
import { HttpClientTestingModule, HttpTestingController } from '../../../../../node_modules/@angular/common/http/testing';
describe('ContactComponent', () => {
let component: ContactComponent;
let fixture: ComponentFixture<ContactComponent>;
let contactService;
let httpMock: HttpTestingController;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ContactComponent ],
imports:[
FormsModule, 
ReactiveFormsModule, 
HttpClientModule, HttpClientTestingModule],
providers:[
{
provide: ContactService,
useValue: jasmine.createSpyObj('contactService', ['sendMail'])
},
{
provide: DivPositionsService,
useValue: jasmine.createSpyObj('divPositionsService', ['updateObj'])
}],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ContactComponent);
component = fixture.componentInstance;
contactService = TestBed.get(ContactService);
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should create form ngOnInit', () => {
component.ngOnInit()
expect(component.contactForm).toBeDefined();
});
it('should submit values from form', () => {
const successMsg = {sucess: true, msg: 'sent'}
const contact:Email = {
name:'Test name',
email: 'Test email',
message: 'Test message',
phone: 'Test phone'
}
console.log(contactService)
expect(contactService).toBeDefined()
contactService.sendMail(contact)
.subscribe(results => {
// expect(results).toBeDefined();
//has to be what is returned by the function
console.log(results)
expect(results).toEqual(successMsg);

});
console.log(contactService)
});
});

在调用contactService.sendMail(contact),之前,您应该mocksendMail的返回值,类似这样。

contactService.sendMail.and.returnValue(Observable.of(successMsg));

希望它能帮助

首先,您监视contactService,它遵循您提供的代码,不会在任何地方定义
您应该在执行compileComponents()函数之前定义您的contactSevice

所以你应该做这样的事情

TestBed.configureTestingModule({
declarations: [ ContactComponent ],
imports:[
FormsModule, 
ReactiveFormsModule, 
HttpClientModule, HttpClientTestingModule],
providers:[
...,
{
provide: ContactService,
useValue: class {
sendMail: () => of({//what ever object you want to return here});
}
}],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();

但是上面的方法使您的mock服务函数被调用,而您实际上无法监视它
如果您需要监视它并使用mock服务执行任何您想要的操作

您可以实现这样的mock类:

class MockContactService {
sendMail() {
return of({});
}
}
let mockContactService;
beforeEach(()=> {
mockContactService = new MockContactService();
TestBed.configureTestingModule({
...,
providers:[
{
provide: ContactService,
useValue: mockContactService,
}],...
})
.compileComponents();
it('what ever', () => {
spyOn(mockContactService, 'sendMail');
})
})

最新更新