Daf 的回答主要对我有用,我只是注意到他的示例代码和他命名文件的方式存在问题。我还遇到了另一个不相关的问题。因此有了新的答案。
- 出于某种原因,当接口文件与匹配器文件同名时,我的应用程序不喜欢它。例如 foo.ts 和 foo.d.ts。对于我的应用程序,它需要是 foo.ts 和 foo-interface.d.ts 或类似的东西。
- 也不要将接口从 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`,
}
}
}
}
};
请注意,该compare
函数可以具有我们想要的任意数量的自定义参数(甚至是可变参数),并且只需要/保留第一个参数(以了解实际值);但是如果函数名以“ toHave
”开头(而不是toReallyEqual
),那么第二个参数是为“ key: string
”保留的(要知道对象的字段名,我的意思是,Jasmine2 会为我们循环)。
此外,我们可以中继 Jasmine 来生成消息,例如:
message: util.buildFailureMessage('toReallyEqual', passes, actual, expected, anotherCustomArg),
接口文件 - 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');
})
});