angular2 тестування: не можна прив’язати до 'ngModel', оскільки це не відома властивість 'input'


101

Я намагаюся перевірити 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');
  }));  
});

Відповіді:


214

Вам потрібно імпортувати FormsModuleв TestBedконфігурацію.

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

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

Що ви робите з TestBedналаштуванням NgModule з нуля для тестового середовища. Це дозволяє додавати лише те, що потрібно для тесту, не маючи зайвих зовнішніх змінних, які можуть вплинути на тест.


42
Цей кутовий матеріал здається таким випадковим. Дякую за твою допомогу.
Піт Б.

11
Погоджено, @ PeteB. Ін'єкція в залежність настільки велика .... вона робить все для вас автоматично ... ПОВЕРНУТЬ ЗАБУДИТЬ ІМПОРТ ТУТ І NO_ERROR_SCHEMA та yada yda ...
Адам Х'юз

Це позбулося моєї помилки, але вона зависає в Кармі і не продовжує створювати інші компоненти після. Він застряг зараз без помилок.
BlockchainDeveloper

1

У мене була така ж проблема, навіть після імпорту модуля форм це не було вирішено. Тому мені довелося використовувати альтернативу ngModel для текстового поля. Перевірте це посилання :

Підсумовуючи це, я використав [value] для прив'язки моделі для текстового поля, як це.

([value])="searchTextValue"

Крім того, якщо ви використовуєте поле дати, потрібно зв'язати модель у ts. у html викличте метод

 (dateSelect)="onDateSelect($event)"

У сценарії типу використовуйте наступний код. Це застосовно, лише якщо ви використовуєте інструмент вибору Ngbdate.

  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;
 }

Це врятувало мені тону часу. Усі ці химерності в кутових тестових шарах. Загнав мене горіхом.
поцілунок-о-матік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.