gpt4 book ai didi

typescript - 使用 Typescript 创建自定义 Jasmine 匹配器

转载 作者:搜寻专家 更新时间:2023-10-30 20:34:13 24 4
gpt4 key购买 nike

我在 angular2 项目上使用 jasmine,在为测试编写自定义匹配器时遇到了一些问题。我希望能够比较两个相对复杂的对象。我找到了 this article它声称可以解决问题,但它只会导致 typescript 错误,指出它无法识别 jasmine 的 Matchers 对象上的新方法。相关代码是这样的:

declare module jasmine {
interface Matchers {
toBeNumeric(): void;
}
}

Another article给出了一个类似但略有不同的解决方案,该解决方案给出了相同的错误。

declare namespace jasmine {
interface Matchers {
toHaveText(expected: string): boolean;
}
}

我试过了

let m: jasmine.Matchers = expect(someSpy.someMethod).toHaveBeenCalled();

得到这个错误:

Type 'jasmine.Matchers' is not assignable to type 'jasmine.Matchers'. Two different types with this name exist, but they are unrelated.

这似乎表明 declare namespace jasmine 语句正在创建一个新的 jasmine 命名空间,而不是扩展现有的命名空间。

那么我怎样才能创建我自己的 typescript 会满意的匹配器呢?

最佳答案

Daf 的回答大部分对我有用我只是注意到他的示例代码和他命名文件的方式存在问题。我还遇到了另一个不相关的问题。因此有了新的答案。

  • 出于某种原因,当接口(interface)文件与匹配器文件同名时,我的应用程序不喜欢它。例如 foo.ts 和 foo.d.ts。对于我的应用程序,它需要是 foo.ts 和 foo-interface.d.ts 或类似的东西。
  • 也不要将接口(interface)从 foo.ts 导入到 foo-interface.d.ts 它似乎也不喜欢这样。

匹配器 - custom-matchers.ts

import MatchersUtil = jasmine.MatchersUtil;
import CustomMatcherFactories = jasmine.CustomMatcherFactories;
import CustomEqualityTester = jasmine.CustomEqualityTester;
import CustomMatcher = jasmine.CustomMatcher;
import CustomMatcherResult = jasmine.CustomMatcherResult;

export const SomeCustomMatchers: CustomMatcherFactories = {
toReallyEqual: function (util: MatchersUtil, customEqualityTester: CustomEqualityTester[]): CustomMatcher {
return {
compare: function (actual: any, expected: any, anotherCustomArg: any): CustomMatcherResult {

// Your checks here.
const passes = actual === expected;

// Result and message generation.
return {
pass: passes,
message: passes ? `Actual equals expected`
: `Actual does not equal expected`,
}
}
}
}
};

NOTE that compare function can have as many custom-parameters as we want (or even Variadic),and that ONLY first-argument is required/reserved (to know actual-value);but if the function name begins with "toHave" (instead of toReallyEqual), then the second argument is reserved for "key: string" (to know object's field name, I mean, Jasmine2 will loop for us).

Also, we could relay on Jasmine for message-generation, like:

message: util.buildFailureMessage('toReallyEqual', passes, actual, expected, anotherCustomArg),

接口(interface)文件 - matcher-types.d.ts - 不能与您的匹配器文件同名

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

自定义匹配器测试

describe('Hello', () => {

beforeEach(() => {
jasmine.addMatchers(SomeCustomMatchers)
});

it('should allow custom matchers', () => {
expect('foo').toReallyEqual('foo');
expect('bar').not.toReallyEqual('test');
})
});

关于typescript - 使用 Typescript 创建自定义 Jasmine 匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com