【问题标题】:Angular/TypeScript: Unit Test call of snackbarAngular/TypeScript:小吃店的单元测试调用
【发布时间】: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


    【解决方案1】:

    我认为您的spyOn 'delete'delete 不准确。

    试试这个:

    import { of } from 'rxjs';
    .....
    spyOn(todoListService, 'delete').and.returnValue(of(null)); // it's up to you what you want to return
    
    component.onDelete(todoList);
    
    expect(snackBar.open).toHaveBeenCalled();
    
    

    【讨论】:

      猜你喜欢
      • 2019-10-14
      • 2020-06-30
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2014-01-21
      • 2020-07-25
      • 1970-01-01
      • 2019-01-15
      相关资源
      最近更新 更多