2017-05-04 56 views
4

我已经lookingaround和这个问题好像是recurring thing。但是,我发现的解决方案似乎都不适合我。如何添加Jasmine自定义匹配器Typescript定义?

使用下列内容:

{ 
    "typescript": "2.3.2", 
    "jasmine-core": "2.6.1", 
    "@types/jasmine": "2.5.47" 
} 

我不能让打字稿合并含有我的自定义匹配定义的命名空间声明。

添加此:

declare namespace jasmine { 
    interface Matchers<T> { 
    toBeAnyOf(expected: jasmine.Expected<T>, expectationFailOutput?: any): boolean; 
    } 
} 

隐藏以前在jasmine声明的所有其他类型。编译器输出错误,如:

[ts] Namespace 'jasmine' has no exported member 'CustomMatcherFactories' 
[ts] Namespace 'jasmine' has no exported member 'CustomMatcher'. 

是否有添加自定义的匹配,使其与打字稿发挥很好的任何适当的方式?

如果您使用的是tslint:recommended规则集,则还有一个tslint问题。这些规则不允许使用namespacemodule关键字,所以我必须禁用linter(或更改"no-namespace"规则)才能尝试此操作。如果这是“不推荐”,不确定如何解决扩展定义。

回答

3

当我添加自定义匹配器时,我不得不修改三个文件。我创建了一个名为matchers.ts的文件,其中包含实际的匹配器。然后我为我的matchers.ts文件添加了一个导入到test.ts。最后,我向typings.d.ts文件添加了一个接口,其中包含我的匹配器。

matchers.ts(任意名称)

beforeEach(() => { 
    jasmine.addMatchers({ 
     toContainText:() => { 
      return { 
       compare: (actual: HTMLElement, expectedText: string, customMessage?: string) => { 
        const actualText = actual.textContent; 
        return { 
         pass: actualText.indexOf(expectedText) > -1, 
         get message() { 
          let failureMessage = 'Expected ' + actualText + ' to contain ' + expectedText; 

          if (customMessage) { 
           failureMessage = ' ' + customMessage; 
          } 

          return failureMessage; 
         } 
        }; 
       } 
      }; 
     }, 
    }); 
}); 

test.ts

import 'test/test-helpers/global/matchers'; (my relative filepath) 

typings.d.ts

declare module jasmine { 
    interface Matchers { 
    toContainText(text: string, message?: string): boolean; 
    } 
} 
+0

的 '声明' 的语句可以完美地愉快地停留在spec.ts文件。 – DJClayworth

相关问题