如何对以 TemplateRef 作为输入的 Angular 组件进行单元测试?

2024-01-19

我正在尝试为 Angular 组件编写单元测试,该组件可以隐藏/显示作为组件本身的输入传递的一些内容。 预期的输入被定义为 TemplateRef。

我的组件.组件.ts

@Component({
    selector: "my-component",
    templateUrl: "./my-component.component.html",
    styleUrls: ["./my-component.component.scss"],
    exportAs: "mycomponent"
})
export class MyComponent {
    private _expanded = false;

    @Input()
    set expanded(value: boolean) {
        this._expanded = value;
    }

    @Input()
    body: TemplateRef<any>;
    @Input()
    handler: TemplateRef<any>;

    constructor() {}

    toggleView() {
        this.expanded = !this._expanded;
    }
}

我的组件.component.html

<div class="wrap">
    <!-- Header -->
    <main #header>
        <header (click)="toggleAccordion()">
            <div class="handler">
                <ng-container [ngTemplateOutlet]="handler">
                </ng-container>
            </div>
            <i class="icon icon-expand" [ngClass]="{ 'icon-expand': _expanded, 'icon-collapse': !_expanded }"></i>
        </header>
    </main>
    <!-- Body -->
    <div class="body" *ngIf="_expanded">
        <ng-container [ngTemplateOutlet]="body"></ng-container>
    </div>
</div>

我想测试通过输入“body”传递的内容是否可见,但我不知道如何在 jasmine 中实例化带有 TemplateRef 输入的“my-component”。

Angular 文档解释了如何传递输入 https://angular.io/guide/testing#component-with-inputs-and-outputs在单元测试脚本上,但由于 TemplateRef 是一个抽象类,我无法实例化任何 TemplateRef 对象,所以我不知道如何管理它。

我的组件.组件.spec.ts


...

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

    beforeEach(() => {
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
        component.body = /* What should I put here? */;
        fixture.detectChanges();
    });

....


我会尽力为您提供一个演示代码,您可以进一步扩展它

基本上,您需要以不同的方式进行测试。因为如果不使用就无法创建组件TemplateRef另一个组件,因此您需要创建一个包装组件并通过为 WrapperComponent 编写测试用例来测试您的组件


@Component({
  template: `
    <ng-template #div1>Something here</ng-template>
    <ng-template #div2>Many things here</ng-template>
    <my-component [expanded]="expandedVal" [body]="div1" [handler]="div2"> </my-component>
  `,
})
class WrapperComponent {
     @ViewChild(MyComponent, { static: true }) appComponentRef: MyComponent;
     public expandedVal = true;
}

describe('MyComponent', () => {
  let app: MyComponent;
  let fixture: ComponentFixture<WrapperComponent>;
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [WrapperComponent, MyComponent],
    }).compileComponents();
  }));
  beforeEach(() => {
    fixture = TestBed.createComponent(WrapperComponent);
    const wrapperComponent = fixture.debugElement.componentInstance;
    app = wrapperComponent.appComponentRef; // this is where you get "MyComponent" component for testing
    fixture.detectChanges();
  });
  it('should create the app', async(() => {
    expect(app).toBeDefined();
  }));
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对以 TemplateRef 作为输入的 Angular 组件进行单元测试? 的相关文章

  • 从单元测试调用时,Application.Current 为 null

    我有一个尝试从单元测试中调用的方法 该方法在现实生活中将从后台线程运行 它使用一些代码来启动 UI 线程的调用更新 使用Application Current Dispatcher BeginInvoke However Applicati
  • XCTestExpectation 错误:API 违规 - 多次调用 -[XCTestExpectation fill]

    我在 Xcode 6 Beta 5 中使用 XCTestExpectations 进行异步测试 我的所有异步测试每次运行时都会单独通过 但是 当我尝试运行整个套件时 某些测试未通过 并且应用程序崩溃了 我得到的错误是说API violati
  • RSpec 与 Shoulda?

    我是单元测试场景的新手 我现在只使用单元测试大约两个月了 当我在 Ruby 中进行单元测试时 我目前遵循 TDD 风格并使用 Test Unit TestCase 我还阅读了 RSpec 以及它如何遵循 BDD 方法 我还读过关于 Shou
  • 手动刷新 Angular 之前页面无法正常显示

    我面临着非常奇怪的问题 我的角度应用程序页面显示正确 它似乎没有完全加载 当我手动重新加载 刷新页面时 它的加载正常 这是完整的场景 我创建了一个登录页面 该页面显示完美并按预期工作 登录后 我导航到仪表板页面 该页面未正确显示 似乎加载了
  • 在 Angular 7 项目中读取来自第三方服务器的 SAML 响应

    我已经创建了一个角 7项目 http myproject com 如果用户未登录 我会将用户重定向到另一个安全身份验证服务器 https secureauth com 登录 这里提示输入用户名和密码 然后检查用户凭据 一旦用户成功登录到安全
  • Chartjs + Angular6 未显示图表或任何错误

    我正在尝试以角度实现chart js 编写了一个简单的代码来在html上显示图表 但是页面上没有输出 也没有错误 我不明白问题出在哪里以及为什么显示图表失败 堆栈闪电战 https stackblitz com edit angularch
  • 带有 angular-cli 的 SVG 图标系统

    我有一个 Angular2 项目 它是通过 Angular CLI 创建的 在 webpack 中 有一个加载器来加载 svg sprite 并从 svgs 列表生成该 sprite 但是 当 angular cli 不允许我更改 webp
  • 是否可以在 Ionic 2 中存储 firebase 数据并以离线模式运行应用程序功能?

    我找到了一些关于 Ionic 2 离线模式 firebase 的教程 但我仍然不知道如何在我的应用程序中启用这个功能 那么 firebase真的支持离线模式吗 如果是 我可以存储所有收到的数据吗 and 在离线模式下运行功能 firebas
  • 如何在 Typescript 中使用正则表达式进行电子邮件验证[重复]

    这个问题在这里已经有答案了 我需要使用 typescript Angular 应用程序验证 Excel 文件中的电子邮件和日期字段 我尝试使用正则表达式进行验证 但对于正确的电子邮件地址 结果始终返回 false 谁能帮我验证电子邮件和日期
  • Angular 6 HTTP 客户端发布 - 错误请求

    我有以下问题 我有一个 API 所在的服务器 我将请求发送到注册端点 但作为响应 我收到 400 错误请求错误 指出必须填写姓名 电子邮件等 问题是它们已经满了 我不再怀念创意了 我的代码 import Component from ang
  • Angular 2 + Auth0(找不到模块“auth0-js”的声明文件。)

    找不到模块 auth0 js 的声明文件 C sandbox loginauth0 node modules auth0 js src index js 隐式具有 any 类型 我想使用 auth0 登录 但在按照说明构建我自己的 Angu
  • Angular 2打开静态页面

    我有 Angular 2 项目 我想在新窗口中打开服务器上可用的静态帮助文件 我试过window open help index html 它导航到该页面 但抛出有关找不到路线的错误 我也尝试在角度区域外运行上面的代码 但没有什么区别 我怀
  • Typescript 从传递的函数返回类型推断返回类型

    我可能正在尝试实现不可能的目标 但事情就这样了 我想定义一个函数 function A 它将返回与传递给函数 A 的参数的新函数相同的类型 e g export function test
  • 如何对转换库进行单元测试?

    我刚刚开始使用 C 进行单元测试 我已经阅读有关单元测试的内容很长时间了 并且已经开始使用 NUnit 但这是我第一次真正尝试为真实代码编写真正的测试 但我的问题是 我很难想出可以实际测试的东西 我要测试的项目是一个转换库 将 POCO 列
  • 从 Angular 6 服务中绑定图像

    我有一个端点 它根据某些参数为我提供图像 这不是一个图像网址 而是一个普通图像 因此 当我到达邮递员中的端点时 作为响应 我收到一张图像 JPG 我是否可以在变量中接收该图像并将其绑定到 HTML 标签中 所有问题都有将图像 url 映射到
  • Mat-table 多行内的多行

    我想要的内容如下图所示 我使用 Angular Material 7 x 并使用 Mat Table 实现 如下所述 https material angular io components table overview https mat
  • TestMethod:异步任务 TestSth() 不适用于 .NET 4.0

    我正在尝试使用 NET 4 0 BCL Async 和 MsTest 运行异步测试方法 看来这个设置不能处理 测试方法 异步Task测试Sth 由于测试用例资源管理器中缺少条目 将签名更改为异步后void 我可以运行测试用例 但结果错误 根
  • Android RxJava 2 JUnit 测试 - android.os.Looper 中的 getMainLooper 未模拟 RuntimeException

    我在尝试为正在使用的演示者运行 JUnit 测试时遇到 RuntimeExceptionobserveOn AndroidSchedulers mainThread 由于它们是纯 JUnit 测试而不是 Android 仪器测试 因此它们无
  • html输入数字,min + step,使step忽略min?

    是否有可能使step忽略min属性
  • Angular + Material - 如何使用 formgroup 处理多个复选框

    我有一个从后端获得的兴趣列表 我希望用户能够选择他们想要的兴趣 我将只存储他们在数据库中检查的兴趣 并在他们加载页面时预先填充 但首先我需要获取用户选择的这些兴趣 兴趣组件 ts export class InterestsComponen

随机推荐