【问题标题】:How to do an unit test to check if the snack bar is open如何进行单元测试以检查小吃店是否营业
【发布时间】:2019-07-18 09:27:09
【问题描述】:

我是 Angular 新手,尤其是在单元测试方面。

最近我一直在做一个组件,以使用角材料 (https://material.angular.io/components/snack-bar/overview) 中的 Mat-Snack-Bar 材料。

创建组件后,我正在对该组件进行单元测试,以检查是否调用了打开小吃店的类。

我已经尝试应用我在堆栈溢出时找到的一些答案,但我无法进行单元测试,并且我在 Karma 应用程序上经常收到此错误消息:

'TypeError: 无法读取未定义的属性'openSnackBar'

我不明白我的组件规范中出了什么问题以及如何解决这个错误。

我的组件.ts:

import { Component, OnInit } from '@angular/core';
import { MatSnackBar ,MatSnackBarHorizontalPosition, MatSnackBarVerticalPosition, } from "@angular/material";

@Component({
  selector: 'app-snack-bar',
  templateUrl: './snack-bar.component.html',
  styleUrls: ['./snack-bar.component.scss']
})
export class SnackBarComponent implements OnInit {

  ngOnInit() {
  }

  constructor(public snackBar: MatSnackBar) {}
  // Position of the snackbar
  horizontalPosition: MatSnackBarHorizontalPosition = 'right';
  verticalPosition: MatSnackBarVerticalPosition = 'top';

/**
 * To use a snackbar add the function openSnackBar('','','')
 * @param message Message that will be shown when the SnackBar is called
 * @param action The message that will be shown on the action button
 * @param state Permit to change the style of the SnackBar depending on the state
 */

  openSnackBar(message: string, action: string, state: string) {
    if ( state == 'suc') {
      var styleOfSnack = 'sucessSnackbar';
    } else if ( state == 'err') {
      var styleOfSnack = 'errorSnackbar';
    } else if ( state == 'inf') {
      var styleOfSnack = 'infoSnackbar';
    } else if ( state == 'war') {
      var styleOfSnack = 'warningSnackbar';
    }
    // code linked to the snackbar
    this.snackBar.open(message, action, {
      duration: 8000,
      panelClass: [styleOfSnack],
      horizontalPosition: this.horizontalPosition,
      verticalPosition: this.verticalPosition,
    });
  }
}

'''

这是我验证代码的 component.spec.ts:

  describe('SnackBar should be open', () => {
  let component: SnackBarComponent;
  let a = "";
  let b = "";
  let c = "";

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [ SnackBarComponent],
      providers: [ MatSnackBar, Overlay ]
    })
    .compileComponents();
    a = "Test";
    b = "X";
    c = "suc";
  });

  afterEach(() => {
    a = "";
    b = "";
    c = "";
  });

  it('opens', () => {
    expect(component.openSnackBar(a,b,c)).toHaveBeenCalled;
  });
})

我希望单元测试检查函数 openSnackBar 是否被调用!

感谢您花时间阅读我的问题,如果您有任何提示或教程来了解初学者的 Angular 单元测试,我正在接受它们!

【问题讨论】:

  • 在实际组件中,你在哪里调用openSnackBar函数?
  • 我应该在我的 HTML 代码中使用它的属性(点击):<button (click)="openSnackBar('Sucess', 'Ok', 'suc')>Test</button>

标签: angular unit-testing angular-material


【解决方案1】:

你没有初始化组件。

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [ SnackBarComponent],
      providers: [ MatSnackBar, Overlay ]
    })
    .compileComponents();
    a = "Test";
    b = "X";
    c = "suc";
    component = TestBed.get(SnackBarComponent);
  });

你没有调用toHaveBeenCalled函数。

  it('opens', () => {
    expect(component.openSnackBar(a,b,c)).toHaveBeenCalled();
  });

【讨论】:

  • 您好,感谢您的帮助,但我仍有一些问题要进行单元测试,您有任何工作示例或教程可以提供以便我完成单元测试吗?谢谢
  • Angular 官方网站上的测试文档会有所帮助。 angular.io/guide/testing
猜你喜欢
  • 2019-09-14
  • 2019-12-04
  • 1970-01-01
  • 2020-11-27
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多