【发布时间】:2020-11-27 22:16:29
【问题描述】:
我有一个方法onDelete,它使用MatSnackBar,它像这样被注入到构造函数中:
constructor(private todoListService: TodolistService, private snackBar: MatSnackBar) { }
onDelete(todoList: TodoList): void {
const deletedTodoListName = todoList.name;
this.todoListService.delete(todoList).subscribe(response => {
this.loadTodoLists();
this.snackBar.open(`${deletedTodoListName} wurde gelöscht`, 'Schliessen', {
duration: 3000,
horizontalPosition: 'center',
verticalPosition: 'bottom',
});
});
}
我尝试对这个方法进行单元测试:
import { async, ComponentFixture, TestBed, inject, getTestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { NavigationviewComponent } from './navigationview.component';
import { TodolistService } from '../todolist.service';
import { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';
import { TodoList } from '../todolist';
import { Observable } from 'rxjs';
describe('NavigationviewComponent', () => {
let injector: TestBed;
let component: NavigationviewComponent;
let fixture: ComponentFixture<NavigationviewComponent>;
let httpMock: HttpTestingController;
let todoListService: TodolistService;
let snackBar: MatSnackBar;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [ HttpClientTestingModule, MatSnackBarModule ],
declarations: [ NavigationviewComponent ],
providers: [ TodolistService, MatSnackBar ]
})
.compileComponents();
}));
beforeEach(() => {
injector = getTestBed();
httpMock = injector.inject(HttpTestingController);
todoListService = injector.inject(TodolistService);
snackBar = injector.inject(MatSnackBar);
fixture = TestBed.createComponent(NavigationviewComponent);
fixture.detectChanges();
component = fixture.componentInstance;
});
afterEach(() => {
httpMock.verify();
});
it('should delete the todolist when onDelete is called', () => {
const todoList: TodoList = { name: 'todoList', listItems: [] };
spyOn(todoListService, 'delete').and.returnValue(new Observable<object>());
spyOn(snackBar, 'open');
component.onDelete(todoList);
expect(snackBar.open).toHaveBeenCalled();
const req = httpMock.expectOne('https://angulareinfuehrungsaufgabetodolistapi.azurewebsites.net/todolist');
expect(req.request.method).toBe('GET');
});
});
但是在执行测试时,它会说
预期的间谍已被调用。
为什么测试无法识别对snackBar 的调用? 通过删除项目执行代码时,可以看到小吃栏。
提前致谢
【问题讨论】:
标签: angular typescript jasmine karma-runner angular-unit-test