Angular Karma - nb-card-header' 不是已知元素

Angular Karma - nb-card-header' is not a known element

当我尝试使用 karma 进行测试时,我在很多页面中都遇到了这个错误....

Failed: Template parse errors:
'nb-card-header' is not a known element:
1. If 'nb-card-header' is an Angular component, then verify that it is part of this module.
2. If 'nb-card-header' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("<nb-card>
  [ERROR ->]<nb-card-header>
      Manage Coupon
  </nb-card-header>
"): ng:///DynamicTestModule/EditCouponComponent.html@1:2
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("e">
                    <input type="text" placeholder="Coupon Name" class="form-control" id="usr" [ERROR ->][(ngModel)]="CouponDetails.name">
                </div>
            </div>
"): ng:///DynamicTestModule/EditCouponComponent.html@12:95
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("">
                    <input type="text" placeholder="Description" class="form-control" id="usr2" [ERROR ->][(ngModel)]="CouponDetails.description">
                </div>
            </div>
"): ng:///DynamicTestModule/EditCouponComponent.html@19:96
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("                       <input type="text" placeholder="Coupon Code" class="form-control" id="stuff" [ERROR ->][(ngModel)]="CouponDetails.code" (keydown)="onKeydown($event)">
                    </span>
       "): ng:///DynamicTestModule/EditCouponComponent.html@27:101
Can't bind to 'ngModel' since it isn't a known property of 'select'. ("     <div class="profile-info-value">
                    <span> 
                        <select [ERROR ->][(ngModel)]="CouponDetails.status" class="browser-default custom-select" placeholder="Select Status">"): ng:///DynamicTestModule/EditCouponComponent.html@35:32
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("                            <input matInput (ngModelChange)="changeMaxDate($event)" [min]="minDate" [ERROR ->][(ngModel)]="CouponDetails.startDate" [matDatepicker]="picker" placeholder="Choose a Promotion Start "): ng:///DynamicTestModule/EditCouponComponent.html@47:100
Can't bind to 'matDatepicker' since it isn't a known property of 'input'. ("Input (ngModelChange)="changeMaxDate($event)" [min]="minDate" [(ngModel)]="CouponDetails.startDate" [ERROR ->][matDatepicker]="picker" placeholder="Choose a Promotion Start Date" >
                            <"): ng:///DynamicTestModule/EditCouponComponent.html@47:138
Can't bind to 'htmlFor' since it isn't a known property of 'mat-datepicker-toggle'.
1. If 'mat-datepicker-toggle' is an Angular component and it has 'htmlFor' input, then verify that it is part of this module.
2. If 'mat-datepicker-toggle' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.
3. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component. ("der="Choose a Promotion Start Date" >
                            <mat-datepicker-toggle matSuffix [ERROR ->][for]="picker"></mat-datepicker-toggle>
                            <mat-datepicker #picker></mat-da"): ng:///DynamicTestModule/EditCouponComponent.html@48:61
'mat-datepicker-toggle' is not a known element:
1. If 'mat-datepicker-toggle' is an Angular component, then verify that it is part of this module.
2. If 'mat-datepicker-toggle' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("[matDatepicker]="picker" placeholder="Choose a Promotion Start Date" >
                            [ERROR ->]<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
                           "): ng:///DynamicTestModule/EditCouponComponent.html@48:28
'mat-datepicker' is not a known element:
1. If 'mat-datepicker' is an Angular component, then verify that it is part of this module.
2. If 'mat-datepicker' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("at-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
                            [ERROR ->]<mat-datepicker #picker></mat-datepicker>
                        </mat-form-field>
               "): ng:///DynamicTestModule/EditCouponComponent.html@49:28
'mat-form-field' is not a known element:
1. If 'mat-form-field' is an Angular component, then verify that it is part of this module.
2. If 'mat-form-field' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("             <div class="profile-info-value">
                    <span> 
                        [ERROR ->]<mat-form-field>
                            <input matInput (ngModelChange)="changeMaxDate($event)""): ng:///DynamicTestModule/EditCouponComponent.html@46:24
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("                    <mat-form-field>
                            <input matInput [min]="minDate2"  [ERROR ->][(ngModel)]="CouponDetails.endDate" [matDatepicker]="pickers" placeholder="Choose Expiration Date">
"): ng:///DynamicTestModule/EditCouponComponent.html@59:62
Can't bind to 'matDatepicker' since it isn't a known property of 'input'. ("
                            <input matInput [min]="minDate2"  [(ngModel)]="CouponDetails.endDate" [ERROR ->][matDatepicker]="pickers" placeholder="Choose Expiration Date">
                            <mat-dat"): ng:///DynamicTestModule/EditCouponComponent.html@59:98
Can't bind to 'htmlFor' since it isn't a known property of 'mat-datepicker-toggle'.
1. If 'mat-datepicker-toggle' is an Angular component and it has 'htmlFor' input, then verify that it is part of this module.
2. If 'mat-datepicker-toggle' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.
3. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component. ("placeholder="Choose Expiration Date">
                            <mat-datepicker-toggle matSuffix [ERROR ->][for]="pickers"></mat-datepicker-toggle>
                            <mat-datepicker #pickers></mat-"): ng:///DynamicTestModule/EditCouponComponent.html@60:61
'mat-datepicker-toggle' is not a known element:
1. If 'mat-datepicker-toggle' is an Angular component, then verify that it is part of this module.
2. If 'mat-datepicker-toggle' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("dDate" [matDatepicker]="pickers" placeholder="Choose Expiration Date">
                            [ERROR ->]<mat-datepicker-toggle matSuffix [for]="pickers"></mat-datepicker-toggle>
                          "): ng:///DynamicTestModule/EditCouponComponent.html@60:28
'mat-datepicker' is not a known element:
1. If 'mat-datepicker' is an Angular component, then verify that it is part of this module.
2. If 'mat-datepicker' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("t-datepicker-toggle matSuffix [for]="pickers"></mat-datepicker-toggle>
                            [ERROR ->]<mat-datepicker #pickers></mat-datepicker>
                        </mat-form-field>
              "): ng:///DynamicTestModule/EditCouponComponent.html@61:28
'mat-form-field' is not a known element:
1. If 'mat-form-field' is an Angular component, then verify that it is part of this module.
2. If 'mat-form-field' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("             <div class="profile-info-value">
                    <span> 
                        [ERROR ->]<mat-form-field>
                            <input matInput [min]="minDate2"  [(ngModel)]="CouponDe"): ng:///DynamicTestModule/EditCouponComponent.html@58:24
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("="number" (keypress)="numberOnly($event)" placeholder="Usage Limit" class="form-control" id="stuff" [ERROR ->][(ngModel)]="CouponDetails.usageLimit">
                    </span>
                </div>
"): ng:///DynamicTestModule/EditCouponComponent.html@71:143
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("  (keypress)="numberOnly($event)" placeholder="Discount Percentage" class="form-control" id="stuff" [ERROR ->][(ngModel)]="CouponDetails.offerPercentage">
                    </span>
                </div>
"): ng:///DynamicTestModule/EditCouponComponent.html@80:161
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("(keypress)="numberOnly2($event)" placeholder="Minimum Order Amount" class="form-control" id="stuff" [ERROR ->][(ngModel)]="CouponDetails.minimumOrderAmount">
                        <label for="stuff" class=" i"): ng:///DynamicTestModule/EditCouponComponent.html@89:153
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("ypress)="numberOnly2($event)" placeholder="Maximum Discount Amount" class="form-control" id="stuff" [ERROR ->][(ngModel)]="CouponDetails.maximumLimit">
                        <label for="stuff" class=" input-i"): ng:///DynamicTestModule/EditCouponComponent.html@99:156
'nb-card-body' is not a known element:
1. If 'nb-card-body' is an Angular component, then verify that it is part of this module.
2. If 'nb-card-body' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("
  </nb-card-header>

  [ERROR ->]<nb-card-body>
        <div class="profile-user-info" *ngIf="CouponDetails">
                
"): ng:///DynamicTestModule/EditCouponComponent.html@5:2
'nb-card' is not a known element:
1. If 'nb-card' is an Angular component, then verify that it is part of this module.
2. If 'nb-card' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("
        </div>
  </nb-card-body>
[ERROR ->]<nb-card>"): ng:///DynamicTestModule/EditCouponComponent.html@119:0
'nb-card' is not a known element:
1. If 'nb-card' is an Angular component, then verify that it is part of this module.
2. If 'nb-card' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("[ERROR ->]<nb-card>
  <nb-card-header>
      Manage Coupon
"): ng:///DynamicTestModule/EditCouponComponent.html@0:0

组件

import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';
import { ApiService } from '../../../../app/services/api.service';
import { ToasterConfig } from 'angular2-toaster';
import { Router, ActivatedRoute } from '@angular/router';
import { NbComponentStatus, NbGlobalPhysicalPosition, NbToastrService} from '@nebular/theme';
import { AuthService } from '../../../services/auth.service';
import { UploadFileService } from '../../../services/upload-file.service';
import { EnvironmentService } from '../../../../environments/environment.service';
import { NgxSpinnerService } from "ngx-spinner";
import { NgbModal,ModalDismissReasons, NgbModalConfig } from '@ng-bootstrap/ng-bootstrap';
import { FormBuilder, FormGroup, FormArray, AbstractControl } from '@angular/forms';
import 'rxjs/add/operator/debounceTime';

export interface Item{

  teaType:string;
  noOfContainers:number;
  weightPerContainerinKgs:number;
  totalItemWeight:number
      
}
@Component({
  selector: 'ngx-edit-menu',
  templateUrl: './edit-coupon.component.html',
  styleUrls: ['./edit-coupon.component.scss']
})

export class EditCouponComponent implements OnInit {  
  minDate: any;
  minDate2: any;
  CouponDetails: any;
  currency:any;
  constructor(private apiService: ApiService,
    private auth: AuthService,
    private toastrService: NbToastrService,
    private router: Router,
    private uploadService:UploadFileService,
    public envService: EnvironmentService,
    private spinner: NgxSpinnerService,
    private modalService: NgbModal,
    private fb: FormBuilder,
    private route: ActivatedRoute) {
      if(localStorage.getItem('CouponId')){
        this.getCouponById(localStorage.getItem('CouponId'));
      } else {
        this.getCoupon();
      }
          
        
  }
 
  ngOnInit() {      
    this.getStatus(); 
    this.minDate = new Date();
    this.currency =localStorage.getItem('CurrencySymbol');
  }

  changeMaxDate(date){
    this.minDate2 = date;
    if(this.CouponDetails.endDate){
      if(new Date(this.CouponDetails.endDate) < new Date(this.minDate2)){
        this.CouponDetails.endDate = null;
        this.showToast('danger', '', 'Please Select Expiry Date');
      }
      
    }

  }

  getCoupon() {
    this.CouponDetails = { 
      name: "", 
      description:"", 
      code: "", 
      status: "", 
      startDate: "", 
      endDate: "", 
      offerPercentage: "", 
      usageLimit: "", 
      minimumOrderAmount: "",
      maximumLimit : "",
    }; 
    this.minDate2 = new Date();
  }

  getCouponById(CouponId){
    this.apiService.getCouponById(CouponId).subscribe((res)=>{
      const data = res.body.discountCodes;
      this.CouponDetails = data;
      this.minDate2 = data.startDate;
    });
  }

  status: any;
  public getStatus(){
    this.status = [
      { value: 'active', label: 'Active' },
      { value: 'inactive', label: 'Inactive' },
    ];
  }

  public savedetails(){
    if(!this.CouponDetails.name || !this.CouponDetails.code || !this.CouponDetails.status 
      || !this.CouponDetails.startDate || !this.CouponDetails.endDate || !this.CouponDetails.usageLimit
      || !this.CouponDetails.offerPercentage || !this.CouponDetails.minimumOrderAmount 
      || !this.CouponDetails.maximumLimit){
        this.showToast('danger', '', 'Please fill the mandatory fields.');
        return;
    }
    if(this.CouponDetails.offerPercentage > 99){
      this.showToast('danger', '', 'Offer percentage should not be greater than 99%.');
        return;
    }
    if(this.CouponDetails.minimumOrderAmount < this.CouponDetails.maximumLimit){
      this.showToast('danger', '', 'Maximum discount amount should not be greater than Minimum order amount.');
        return;
    }
    this.spinner.show();
    this.CouponDetails.venueId = localStorage.getItem('venuesID');
    if(this.CouponDetails._id){
      this.apiService.editCoupon(this.CouponDetails).subscribe((res)=>{
        this.spinner.hide();
        if(res.status == true){
         this.router.navigate(['/pages/orders/coupons']);   
          this.showToast('success', '', 'Succesfully updated');
        } else {
            this.showToast('danger', '', 'Error');
        } 
      });
    } else {
      this.apiService.saveCoupon(this.CouponDetails).subscribe((res)=>{
        this.spinner.hide();
        if(res.status == true){
          this.router.navigate(['/pages/orders/coupons']);   
          this.showToast('success', '', 'Succesfully added');
        } else {
            this.showToast('danger', '', 'Error');
        } 
      });
    }
  }
  
  cancel(){
    this.router.navigate(['/pages/orders/coupons']);   
  }

  numberOnly(event): boolean {
    const charCode = (event.which) ? event.which : event.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
      return false;
    }
    if(this.CouponDetails.offerPercentage>99){
      return false;
    }
    return true;
  }

  dotCount:any;
  checkNumberOnly:any;
  checkString:any;
  cdr:any;
  numberOnly2(event): boolean {          
    const charCode = (event.which) ? event.which : event.keyCode;      
    if (charCode == 46) {
        this.dotCount += 1;
        this.checkNumberOnly = (event.target.value);
        var numericCheck = (event.target.value).toString();
        if (numericCheck.includes('.')) {
          this.dotCount += 1;
        }
        if (this.dotCount > 1) {   
            this.dotCount = 0;
            return false;
        }
    }
    if (charCode > 31 && (charCode < 45 || charCode > 57 || charCode==47)) {
        return false;
    }
    this.checkNumberOnly = (event.target.value);
    if (this.checkNumberOnly != null) {
        var numeric = (event.target.value).toString();
        if (numeric.includes('.')) {
            var checkNumeric = numeric.split('.');
            if (checkNumeric.length > 2) {
                return false;
            }
            this.checkString = checkNumeric[1].split('');
            if (this.checkString.length > 1) {
              return false;
            }
        }
    }
    this.dotCount = 0;
    return true;
  } 

  onKeydown(event) {
    if (event.keyCode === 32 ) {
      return false;
    }    
  }
  
  config: ToasterConfig;

  private showToast(type: NbComponentStatus, body: string, title: string) {
    const config = {
      status: type,
      destroyByClick: true,
      duration: 2000,
      position: NbGlobalPhysicalPosition.TOP_RIGHT,
      preventDuplicates: false,
    };
    const titleContent = title ? `${title}` : '';
    this.toastrService.show(
      body,
      `${titleContent}`,
      config);
  }

}

Spect.ts

import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { EditCouponComponent } from './edit-coupon.component';

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

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ EditCouponComponent ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(EditCouponComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});


谢谢...................................... ..................................................... ..................................................... ..................................................... ..................................................... ..................................................... ...................................

您需要在规范文件中导入声明 nb-card-header 元素的组件,并在其中提及 configureTestingModule 作为导入。

// spec.ts
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { EditCouponComponent } from './edit-coupon.component';

// I have assumed ng-card-header element is declared within NbComponentStatus. Use appropriate module/component.
import { NbComponentStatus } from '@nebular/theme';

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

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ EditCouponComponent ],
      imports: [ NbComponentStatus ],
    })
    .compileComponents();
  }));

// rest of spec file code

要解决错误 Can't bind to 'ngModel' since it isn't a known property of 'input',您需要导入 FormsModule 并以与上述类似的方式提及它。

我已经解决了添加 'NbCardModule' 的问题。