Prueba angular2: no se puede enlazar a 'ngModel' ya que no es una propiedad conocida de 'input'

101

Estoy tratando de probar el enlace bidireccional angular2 para el control input. Aquí está el error:

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

El app.component.html

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

La 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');
  }));  
});
beewest
fuente

Respuestas:

214

Necesita importar el FormsModuleen la TestBedconfiguración.

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

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

Lo que está haciendo con el TestBedes configurar un NgModule desde cero para el entorno de prueba. Esto le permite agregar solo lo que se necesita para la prueba sin tener variables externas innecesarias que puedan afectar la prueba.

Paul Samsotha
fuente
42
Este material angular parece tan aleatorio. Gracias por tu ayuda.
Pete B.
11
De acuerdo, @PeteB. La inyección de dependencia es tan grande ... hace todo por usted automágicamente ... NO OLVIDE IMPORTAR AQUÍ Y NO_ERROR_SCHEMA y yada yda ...
Adam Hughes
Esto eliminó mi error, pero se cuelga en Karma y no continúa creando los otros componentes después. Ahora está atascado sin errores.
BlockchainDeveloper
1

Tuve el mismo problema, incluso después de importar el módulo de formularios, esto no se resolvió. Entonces tuve que usar una alternativa a ngModel para el campo de texto. Por favor, consulte este enlace :

En resumen, usé [valor] para vincular el modelo para el campo de texto de esta manera.

([value])="searchTextValue"

Además, si está utilizando el campo de fecha, debe vincular el modelo en ts. en el html, llame al método

 (dateSelect)="onDateSelect($event)"

En el script de tipo, use el siguiente código. Esto es aplicable solo si está usando el selector 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;
 }
Venkatesh K
fuente
Esto me ahorró mucho tiempo. Todas estas peculiaridades en los bancos de pruebas angulares. Me vuelve loco.
kiss-o-matic