У вас есть зависимость с именем loginService
в вашем классе. Поскольку вы тестируете свой компонент, нет необходимости добавлять фактическую службу в массив providers
. Но вы должны предоставить имитацию или заглушку в качестве службы входа в систему.
Сначала создайте фиктивный объект службы, подобный этому.
const loginSuject = new Subject();
const mockLoginServce = {
loginUser: () => {
return loginSuject.asObservable();
}
}
Как вы видите здесь, я возвратил тему в качестве наблюдателя из метода loginUser
. Мы должны сделать это, потому что фактический метод также возвращает Observable
.
Затем необходимо добавить фиктивную службу в массив TestBed
provider. И получите экземпляр провайдера, используя метод TestBed.get()
.
TestBed.configureTestingModule({
declarations: [ LoginComponent ],
imports: [], // your import go here.
providers: [{provide: LoginService, useValue: mockLoginServce}]
})
.compileComponents();
service = TestBed.get(LoginService);
И когда вы тестируете метод loginUser
компонента, вы должны вызвать subject.next()
. И вы можете передать объект ответа в next method
.
Ваш тестовый костюм должен выглядеть следующим образом.
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MatSelectModule, MatInputModule, MatCardModule, MatButtonModule, MatDatepickerModule, MatNativeDateModule } from '@angular/material';
import { FormGroup, FormsModule, FormControl, FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
import { RouterTestingModule } from '@angular/router/testing';
import { HttpClientModule } from '@angular/common/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { LoginComponent } from './login.component';
import { Subject } from 'rxjs';
describe('LoginComponent', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
let service: LoginService;
const loginSuject = new Subject();
const mockLoginServce = {
loginUser: () => {
return loginSuject.asObservable();
}
}
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [LoginComponent],
imports: [RouterTestingModule, ReactiveFormsModule, FormsModule, MatSelectModule, HttpClientModule, MatInputModule, BrowserAnimationsModule, MatCardModule, MatButtonModule, MatDatepickerModule, MatNativeDateModule],
providers: [{ provide: LoginService, useValue: mockLoginServce }]
})
.compileComponents();
service = TestBed.get(LoginService);
}));
beforeEach(() => {
fixture = TestBed.createComponent(LoginComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
describe('#loginUser tests', () => {
it('Should return a valid response when loginService.loginUser is invoked', () => {
const reponseData = { toke: 'asdasdasd' };
loginSuject.next(reponseData);
const loginUserData = {} // add the object here
service.loginUser(loginUserData).subscribe((res) => {
expect(res).toEqual(reponseData);
});
});
});
});
А более подробную информацию о тестировании угловых компонентов с зависимостью можно найти в угловой официальной документации