【问题标题】:Angular 2 and Jasmine unit testing: cannot get the innerHtmlAngular 2 和 Jasmine 单元测试:无法获取 innerHtml
【发布时间】:2017-03-06 18:27:06
【问题描述】:

我正在使用测试组件“WelcomeComponent”的示例之一:

import { Component, OnInit } from '@angular/core';
import { UserService }       from './model/user.service';

@Component({
    selector: 'app-welcome',
     template: '<h3>{{welcome}}</h3>'
})
export class WelcomeComponent implements OnInit {
    welcome = '-- not initialized yet --';
    constructor(private userService: UserService) { }

    ngOnInit(): void {
        this.welcome = this.userService.isLoggedIn ?
            'Welcome  ' + this.userService.user.name :
            'Please log in.';
    }
}

这是测试用例,我正在检查“h3”是否包含用户名“Bubba”:

import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By }              from '@angular/platform-browser';
import { DebugElement }    from '@angular/core';

import { UserService }       from './model/user.service';
import { WelcomeComponent } from './welcome.component';


describe('WelcomeComponent', () => {

    let comp: WelcomeComponent;
    let fixture: ComponentFixture<WelcomeComponent>;
    let componentUserService: UserService; // the actually injected service
    let userService: UserService; // the TestBed injected service
    let de: DebugElement;  // the DebugElement with the welcome message
    let el: HTMLElement; // the DOM element with the welcome message

    let userServiceStub: {
        isLoggedIn: boolean;
        user: { name: string }
    };

    beforeEach(() => {
        // stub UserService for test purposes
        userServiceStub = {
            isLoggedIn: true,
            user: { name: 'Test User' }
        };

        TestBed.configureTestingModule({
            declarations: [WelcomeComponent],
            // providers:    [ UserService ]  // NO! Don't provide the real service!
            // Provide a test-double instead
            providers: [{ provide: UserService, useValue: userServiceStub }]
        });

        fixture = TestBed.createComponent(WelcomeComponent);
        comp = fixture.componentInstance;

        // UserService actually injected into the component
        userService = fixture.debugElement.injector.get(UserService);
        componentUserService = userService;
        // UserService from the root injector
        userService = TestBed.get(UserService);
        //  get the "welcome" element by CSS selector (e.g., by class name)
        el = fixture.debugElement.nativeElement; // de.nativeElement;
    });


    it('should welcome "Bubba"', () => {
        userService.user.name = 'Bubba'; // welcome message hasn't been shown yet
        fixture.detectChanges();
        const content = el.querySelector('h3');
        expect(content).toContain('Bubba');
    });
});

当使用 Karma 测试和调试测试用例时,如果我在控制台中评估“el.querySelector('h3'),它会显示以下内容

<h3>Welcome  Bubba</h3>

如何,我可以获得标题的 innerHtml,因为它在将其包含在 ts 文件中时无法解析,并且测试用例的评估结果始终为 false。

这就是它所说的:'innerHTML' 在类型'HTMLHeadingElement'上不存在

【问题讨论】:

    标签: unit-testing angular jasmine karma-jasmine


    【解决方案1】:

    因为content

    const content = el.querySelector('h3');
    expect(content).toContain('Bubba');
    

    HTMLNode,而不是原始文本。所以你期望 HTMLNode 是一个字符串。这将失败。

    您需要使用content.innerHTMLcontent.textContent 提取原始HTML(以获取&lt;h3&gt; 标记之间的内容

    const content = el.querySelector('h3');
    expect(content.innerHTML).toContain('Bubba');
    expect(content.textContent).toContain('Bubba');
    

    【讨论】:

    • 感谢@peeskillet 澄清这一点。我在我的问题中添加了更多细节。我知道它缺少应该调用的属性 innerHTML,但无法解决,我错过了什么吗?
    • 您是否收到运行时错误?或者它只是IDE中的一个错误?我测试了它,它对我来说很好用
    • 我运行它,它工作正常。我认为它会运行,因为 IDE 没有解决它。你知道如何解决这个问题吗?
    • 我不知道如何“修复”它,因为我无法在我的环境中重现它。但要解决它,你可以做(&lt;any&gt;content).innerHTML
    • @Coding - re: missing prop --> const content = el.querySelector('h3') as HTMLElement; content 现在有.innerHTML
    猜你喜欢
    • 2019-03-13
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多