为什么在Jasmine测试这个Angular TypeScript应用的过程中,primeng对话框是空的?

wd2eg0qa  于 2023-05-01  发布在  TypeScript
关注(0)|答案(2)|浏览(112)

我试图通过点击实际元素来测试一个组件。然而,这些元素在测试中似乎没有正确渲染。
我有以下组件。

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

我错过了什么?

vmdwslir

vmdwslir1#

根据文档,默认可见性为false(https://www.full.com)。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);
});
chhqkbe1

chhqkbe12#

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

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

相关问题