繁体   English   中英

为什么在 Angular 打字稿应用程序的 Jasmine 测试期间,primeng 对话框为空

[英]Why is primeng dialog empty during Jasmine testing of Angular typescript app

我正在尝试通过单击实际元素来测试组件。 但是,这些元素在测试中似乎无法正确呈现。

我有以下组件。

import {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core';

@Component({
    selector: 'app-help',
    changeDetection: ChangeDetectionStrategy.OnPush,
    templateUrl: './help.component.html',
    styleUrls: ['./help.component.scss']
})
export class HelpComponent {
    @Input() showHelp = false;
    @Input() version = '0';
    @Input() versionCheck = false;
    @Output() emitCloseHelpDialog = new EventEmitter<any>();
    @Output() emitSubmitHelpForm = new EventEmitter<any>();

    additionalHelpInformationStr = '';

    closeHelpDialog(evt) {
        this.emitCloseHelpDialog.emit();
    }

    submitHelpForm(evt) {
        const formData = {
            additionalHelpInformationStr: 
            this.additionalHelpInformationStr,
        };
        this.emitSubmitHelpForm.emit(formData);
    }

    reloadIdea(evt) {
        location.reload(true);
    }
}

它有一个看起来像这样的模板:

<p-dialog (onHide)="closeHelpDialog($event)"
      [(visible)]="showHelp"
      [closeOnEscape]="false"
      [modal]="false"
      [resizable]="false"
      [responsive]="false"
      appendTo="body"
      styleClass="help-dialog"
      header="Support">
<div *ngIf="versionCheck">
    A new version ofis available. Click to <span 
(click)="reload($event)"
class="new-version-notice">reload</span>.
    <br/>
</div>
<span>
    Please add a comment or concern below.<br/>
    <textarea [(ngModel)]="additionalHelpInformationStr"
              #additionalHelpInformation
              cols="75"
              class="help-textarea"
              pInputTextarea
              rows="10"></textarea>
</span>
<div class="style-notice">
    Version: {{ version }}
</div>
<p-footer>
    <p class="align-right">
        <button (click)="closeHelpDialog($event)"
                class="ui-button-secondary"
                icon="fa fa-fw fa-close"
                label="Cancel"
                type="button"
                pButton></button>
        <button (click)="submitHelpForm($event)"
                class="ui-button"
                icon="fa fa-paper-plane"
                label="Send"
                type="button"
                pButton></button>
    </p>
</p-footer>

问题是当我尝试测试时。 HTML 未完全呈现。

<div id="root0" _nghost-a-c0="" ng-version="8.2.4">
    <p-dialog _ngcontent-a-c0="" 
              appendto="body" 
              header="Support" 
              styleclass="help-dialog" 
              ng-reflect-visible="false" 
              ng-reflect-header="Support" 
              ng-reflect-resizable="false" 
              ng-reflect-modal="false" 
              ng-reflect-close-on-escape="false" 
              ng-reflect-responsive="false" 
              ng-reflect-append-to="body" 
              ng-reflect-style-class="help-dialog">
    <!--bindings={"ng-reflect-ng-if": "false"}-->
</p-dialog>
</div>

这是我的测试组件的样子:

import {ComponentFixture, TestBed} from '@angular/core/testing';
import {HelpComponent} from './help.component';
import {DialogModule} from 'primeng/dialog';
import {InputTextareaModule} from 'primeng/inputtextarea';
import {FormsModule} from '@angular/forms';

describe('help component', () => {

    let app: HelpComponent;
    let fixture: ComponentFixture<HelpComponent>;

    beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [
                HelpComponent,
            ],
            imports: [
                DialogModule,
                FormsModule,
                InputTextareaModule,
            ],
            }
        );

        fixture = TestBed.createComponent(HelpComponent);
        app = fixture.debugElement.componentInstance;
    });

    it('should create properly', () => {
        expect(app).toBeTruthy();
        fixture.detectChanges();
        fixture.whenStable().then(() => {
        const element = fixture.nativeElement;
        // this console log outputs the HTMLfragment above which is empty
        console.log('element is ', element);
    });
});

    it('should emit close dialog event', () => {
        // this test of course works.
        const component = fixture.componentInstance;
        spyOn(component.emitCloseHelpDialog, 'emit');
        component.closeHelpDialog(new Event('click'));
        fixture.detectChanges();  
     expect(component.emitCloseHelpDialog.emit).toHaveBeenCalledWith();    
    });   
});

我错过了什么。

根据文档,默认可见性为 false ( https://www.primefaces.org/primeng/showcase/#/dialog ) 因此,对话框必须首先可见。

it('should create properly', () => {
    expect(app).toBeTruthy();
    app.showHelp = true;
    fixture.detectChanges();
    fixture.whenStable().then(() => {
    const element = fixture.nativeElement;
    console.log('element is ', element);
});

再一次,在问完这个问题之后,我想出了答案。 :)

从 npm 或类似安装 ng-mocks,然后将您的 TestBed 更改为以下内容:

TestBed.configureTestingModule({
        declarations: [
            HelpComponent,
            MockComponent(Dialog),
        ],
        schemas: [
            CUSTOM_ELEMENTS_SCHEMA
        ],
        imports: [
            FormsModule,
            InputTextareaModule,
        ],
        }
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM