【问题标题】:TypeError: Cannot read property 'show' of undefinedTypeError:无法读取未定义的属性“显示”
【发布时间】:2019-04-04 07:31:05
【问题描述】:

我正在为 Angular 7 中的 ngx-bootstrap (bsDateRangePickerDirective) 编写测试用例。但是当我尝试从规范文件中打开 bsdaterangePickerDirective 实例时,我收到无法读取未定义的属性显示的错误。

以下是我写的代码:

component.ts 文件

@ViewChild("sdp") sdatepicker: BsDaterangepickerDirective;
// Function
openDatePicker() {
    this.sdatepicker.show();
  }

Component.spec.ts 文件

import { ComponentFixture, async, TestBed } from "@angular/core/testing";
import { NO_ERRORS_SCHEMA } from "@angular/core";
import { NameComponent } from "./name-box.component";
import { FormsModule } from "@angular/forms";
import { BsDatepickerModule, BsDaterangepickerDirective } from "ngx-bootstrap";
import { HttpClientTestingModule } from "@angular/common/http/testing";

describe('NameComponent', () => {
  let fixture: ComponentFixture<SearchBoxComponent>;
  let component: SearchBoxComponent;

  beforeEach(async(() => {

    TestBed.configureTestingModule({
      declarations: [NameComponent],
      imports: [
        FormsModule,
        BsDatepickerModule,
        HttpClientTestingModule
      ],
      schemas: [NO_ERRORS_SCHEMA],
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(NameComponent);
    component = fixture.componentInstance;

  });


  it('Should open date picker', () => {
    const dateSpy = spyOn(BsDaterangepickerDirective.prototype, "show").and.returnValue(true);
    component.openDatePicker('sdatepicker');
    expect(dateSpy).toHaveBeenCalled();
  });

});

组件模板文件:

<div class="grid-search-datepicker date-selector">
      <input type="text" class="form-control" id="start-date-selector_{{searchTableId}}" [(ngModel)]="dateRange.startDate"
        bsDatepicker #sdp="bsDatepicker" (onHidden)="updateMinEndDate()" [bsConfig]="startDateConfig" placeholder="{{l10n.fromdate}}"
        readonly>
      <i class="icon-small-calendar text-blue open-datetimepicker" (click)='openDatePicker("sdatepicker")' aria-hidden="true"></i>
    </div>

【问题讨论】:

  • 组件模板中的 ViewChild 是什么?
  • 你还需要像下面这样更改它才能访问BsDaterangepickerDirective属性:@ViewChild("sdp",{read: BsDaterangepickerDirective}) sdatepicker: BsDaterangepickerDirective;
  • @Mike:通过 ViewChild,我正在使用 sdp 作为本地引用变量从 HTML 访问 bsDatePicker 模板
  • @HarunYılmaz:我尝试了您的解决方案,但没有成功
  • 没有我的不是完整的解决方案。它只是其中的一部分。除非看到模板文件,否则我什么也说不出来

标签: javascript angular jasmine ngx-bootstrap


【解决方案1】:

在您的模板中,您使用的是bsDatepicker,但在组件中您将其称为BsDaterangepickerDirective。我认为如果您将模板更改为:

<div class="grid-search-datepicker date-selector">
  <input type="text" class="form-control" id="start-date-selector_{{searchTableId}}" 
    [(ngModel)]="dateRange.startDate"
    bsDaterangepicker
    #sdp="bsDaterangepicker"
    (onHidden)="updateMinEndDate()"
    [bsConfig]="startDateConfig"
    placeholder="{{l10n.fromdate}}"
    readonly
  >
  <i class="icon-small-calendar text-blue open-datetimepicker" 
    (click)='openDatePicker("sdatepicker")'
    aria-hidden="true"
  >
  </i>
</div>

见:https://stackblitz.com/edit/angular-sgaq4e

【讨论】:

  • 迈克你还有其他解决方案吗
  • 我所说的有效,我已经包含了一个堆栈闪电
  • 是的,迈克,功能方面它正在工作,但测试用例仍然失败
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多