การทดสอบ angular2: ไม่สามารถผูกกับ 'ngModel' ได้เนื่องจากไม่ใช่คุณสมบัติที่เป็นที่รู้จักของ 'input'


106

ฉันพยายามที่จะทดสอบ angular2 inputสองทางผูกพันสำหรับการควบคุม นี่คือข้อผิดพลาด:

Can't bind to 'ngModel' since it isn't a known property of 'input'.

app.component.html

<input id="name" type="text" [(ngModel)]="name" />
<div id="divName">{{name}}</div>

app.component.ts

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html'  
})
export class AppComponent implements OnInit {
  name: string;    
}

app.component.spec.ts

import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { AppService } from './app.service';
describe('App: Cli', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
      providers:[AppService]
    });
  });

  it('divName', async(() => {
    let fixture = TestBed.createComponent(AppComponent);
    let comp = fixture.componentInstance;
    comp.name = 'test';
    fixture.detectChanges();

    let compiled = fixture.debugElement.nativeElement;    
    expect(compiled.querySelector('divName').textContent).toContain('test');
  }));  
});

คำตอบ:


219

คุณต้องนำเข้าFormsModuleในTestBedconfigfuration

import { FormsModule } from '@angular/forms';

TestBed.configureTestingModule({
  imports: [ FormsModule ],
  declarations: [
    AppComponent
  ],
  providers:[AppService]
});

สิ่งที่คุณกำลังทำกับการTestBedกำหนดค่า NgModule ตั้งแต่เริ่มต้นสำหรับสภาพแวดล้อมการทดสอบ วิธีนี้ช่วยให้คุณเพิ่มเฉพาะสิ่งที่จำเป็นสำหรับการทดสอบโดยไม่ต้องมีตัวแปรภายนอกที่ไม่จำเป็นซึ่งอาจส่งผลต่อการทดสอบ


44
สิ่งเชิงมุมนี้ดูเหมือนสุ่ม ขอขอบคุณสำหรับความช่วยเหลือของคุณ.
Pete B.

11
เห็นด้วย @PeteB. การฉีดพึ่งพานั้นยอดเยี่ยมมาก .... มันทำทุกอย่างเพื่อคุณโดยอัตโนมัติ ... เพียงแค่อย่าลืมนำเข้าที่นี่และไม่ _ERROR_SCHEMA และ yada yda ...
Adam Hughes

สิ่งนี้กำจัดข้อผิดพลาดของฉัน แต่มันค้างใน Karma และไม่ได้สร้างส่วนประกอบอื่น ๆ ต่อหลังจากนั้น ตอนนี้ติดอยู่โดยไม่มีข้อผิดพลาด
BlockchainDeveloper

1

ฉันมีปัญหาเดียวกันแม้ว่าหลังจากนำเข้าโมดูลฟอร์มแล้วก็ยังไม่สามารถแก้ไขได้ ดังนั้นฉันจึงต้องใช้ทางเลือกอื่นแทน ngModel สำหรับช่องข้อความ โปรดตรวจสอบลิงค์นี้:

โดยสรุปฉันใช้ [ค่า] เพื่อผูกโมเดลสำหรับฟิลด์ข้อความเช่นนี้

([value])="searchTextValue"

นอกจากนี้หากคุณใช้ฟิลด์วันที่คุณต้องผูกโมเดลด้วย ts ใน html เรียกเมธอด

 (dateSelect)="onDateSelect($event)"

ใน type script ใช้รหัสต่อไปนี้ใช้ได้เฉพาะในกรณีที่คุณใช้ Ngbdate picker

  onDateSelect(event) {
  let year = event.year;
  let month = event.month <= 9 ? '0' + event.month : event.month;;
  let day = event.day <= 9 ? '0' + event.day : event.day;;
  let finalDate = year + "-" + month + "-" + day;
  this.finalDateVlaue = finalDate;
 }

สิ่งนี้ช่วยให้ฉันประหยัดเวลาได้มาก นิสัยใจคอทั้งหมดนี้ในเตียงทดสอบเชิงมุม ทำให้ฉันบ้า
kiss-o-matic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.