将Jasmine自定义匹配器与Angular CLI项目一起使用

时间:2019-01-21 01:44:45

标签: angular typescript unit-testing jasmine jasmine-matchers

我有一个简单的需求:在Angular CLI项目(Angular v6)的Jasmine单元测试中使用自己的自定义匹配器。 几个限制:

  • 我不想在node_modules下进行任何修改;这个项目必须能够通过我的构建管道,每次都进行全新安装。
  • 我不想只为了能够添加到tsconfig.spec.json中的types而构建一个npm模块。

到目前为止,我能分辨出的是我需要一个.d.ts文件,所以这是我的matchers.d.ts:

/// <reference path="../../../node_modules/@types/jasmine/index.d.ts" />

declare namespace jasmine {
  interface Matchers<T> {
    toContainPath(path: string): boolean;
  }
}

在同一目录中,我有matchers.ts文件:

export const customMatchers: jasmine.CustomMatcherFactories  = {

  // Affirms the element contains a sub-element at the given CSS path.
  toContainPath: function (_util, _customEqualityTesters) {
    return {
      compare: function (element: HTMLElement, path: string) {
        const result = {
          pass: false,
          message: ''
        };
        if (!element) {
          result.message = 'Expected element to be non-empty';
        } else if (!path) {
          result.message = 'Expected path to be non-empty';
        } else {
          result.pass = element.querySelector(path) !== null;
          result.message =
            'Expected ' + element + (result.pass ? ' not' : '') + ' to contain ' + path;
        }
        return result;
      }
    };
  }
};

在我的测试(规格)文件中,我有:

import { customMatchers } from 'app/testing/matchers';
. . .
/// <reference path="../../../testing/matchers.d.ts" />
. . .
 beforeEach(() => {
    jasmine.addMatchers(customMatchers);
. . .

最后,我在包含的测试中使用匹配器,例如:

expect(element).toContainPath('my-sidebar');

我还尝试将matchers.d.ts的完整路径添加到tsconfig.spec.json中的types数组中。

A,我无法找到有效的解决方案。失败继续表现为 error TS2339: Property 'toContainPath' does not exist on type 'Matchers<HTMLElement>'

我看过的有希望的地方,但无济于事:

  1. custom jasmine matchers
  2. adding a jasmine matcher TypeScript definition
  3. jasmine matchers
  4. testing Angular with custom matchers
  5. manually add typing file to TypeScript

有人可以提供秘密调味料吗?

1 个答案:

答案 0 :(得分:0)

这两个答案加起来对我有用!

Create custom jasmine matcher using Typescript

在测试文件夹中添加了index.ts,并使.ts和.d.ts文件具有不同的名称(例如custom-matchers.ts和matchers-types.d.ts)。