自定义比对器

通常,一个项目会想封装自定义比对代码以用于多个规范。以下是创建与 Jasmine 兼容的自定义比对器的方法。

一个自定义比对器在其根部是一个比较函数,它获取一个actual值和一个expected值。此工厂被传递给 Jasmine,最好是在对beforeEach的调用中并且它在给定对describe的调用中的所有规范的范围中且可用。自定义比对器在规范之间被终止。此工厂的名称将成为在对expect的调用的返回值上公开的比对器的名称。

此对象有一个名为“toBeGoofy”的自定义比对器。

const customMatchers = {

比对器工厂

自定义比对器工厂被传递一个matchersUtil参数,它有一组效用函数供比对器用于执行诸如确定两个对象是否相等等的任务(请参阅:MatchersUtil以获取参考文档)。通过在适当的地方使用MatchersUtil,自定义比对器可以与自定义相等性测试器自定义对象格式化程序协同工作,而无需任何额外工作。

为了与 Jasmine 3.5 及更早版本兼容,传递了第二个customEqualityTesters参数。为 Jasmine 3.6 及更高版本编写的比对器应该忽略它。它将不再在 Jasmine 4 中提供。

    toBeGoofy: function(matchersUtil) {

该工厂方法应该返回一个具有一个compare函数的对象,该函数将被调用以检查期望。

        return {

用于compare的函数

该比较函数接收作为第一个参数传递给expect()的值 - 实际值 - 并且(如果有的话)作为第二个参数传递给比对器本身的值。

            compare: function(actual, expected) {

toBeGoofy采用一个可选的expected参数,因此如果没有传入,则在此处定义它。

                if (expected === undefined) {
                    expected = '';
                }

结果

这个compare函数必须返回一个结果对象,带有pass属性,它是比对器的布尔值结果。该pass属性告诉期望比对器是否成功(true)或不成功(false)。如果期望是用.not进行调用/链接的,那么期望将否决此值以确定期望是否得到满足。

                const result = {
                };

toBeGoofy会测试实际的hyuk属性是否等于期望以查看它是否匹配期望。

                result.pass = matchersUtil.equals(actual.hyuk, 
                    "gawrsh" + expected);

失败消息

如果将此值保留为undefined,那么期望将尝试为比对器创建一个失败消息。但是,如果返回值具有一个message属性,那么它将用于失败的期望。

                if (result.pass) {

比对器已成功,所以自定义失败消息应该出现在否定期望的情况下 - 即当期望被用来.not

                    result.message = "Expected " + actual + 
                        " not to be quite so goofy";
                } else {

匹配器失败,因此在正面期望的情况下,应该存在自定义失败消息

                    result.message = "Expected " + actual + 
                        " to be goofy, but it was not very goofy";
                }

返回比较结果。

                return result;
            }
        };
    }
};

自定义负比较器

如果你需要比上面简单的布尔反演更精确地控制负比较(“not” 情况),你的比较器工厂还可以包含另一个键alongside comparenegativeCompare,它的值是一个在使用 .not 时调用的函数。此函数/键是可选的。

注册和用法

describe("Custom matcher: 'toBeGoofy'", function() {

使用 Jasmine 注册自定义匹配器。传递进来的对象的全部属性都将可用作自定义匹配器(例如,在本例中为 toBeGoofy)。

    beforeEach(function() {
        jasmine.addMatchers(customMatchers);
    });

一旦使用 Jasmine 注册了自定义匹配器,即可在任何期望中使用它。

    it("is available on an expectation", function() {
        expect({
            hyuk: 'gawrsh'
        }).toBeGoofy();
    });

    it("can take an 'expected' parameter", function() {
        expect({
            hyuk: 'gawrsh is fun'
        }).toBeGoofy(' is fun');
    });

    it("can be negated", function() {
        expect({
            hyuk: 'this is fun'
        }).not.toBeGoofy();
    });
});