Jasmine JS'不是#39;属性

时间:2015-03-03 23:08:17

标签: javascript jasmine

真实快速jasmine.addMatchers。使用git的最新Jasmine构建,看起来自定义匹配器的格式与我在“Jasmine JavaScript Testing”一书中看到的代码大不相同。在书中它有代码,如:

this.actual or maybe even this.isNot

新格式如下:

compare: function (actual, expected) {
    return {
        pass: some true or false statement...
    }
}

所以,在这种情况下,'this.actual'实际上是传递参数'actual',这很酷。如果我们正在调用一个新的匹配器,例如:

,那么访问isNot属性怎么样
expect(investment).not.toBeAGoodInvestment();

因此,在'toBeAGoodInvestment'的主体内,我们应该能够访问'isNot'属性。不知道如何使用新格式。我想出了如何将this.message从旧方式设置为新方式,如:

return {
    pass: some statement...,
    message: 'some message'
}

我们希望在茉莉花记者中出现的信息将根据“isNot”设置的内容而动态显示。

1 个答案:

答案 0 :(得分:1)

在实际的Jasmine.js源代码中进行挖掘之后,我发现了参数传递到自定义匹配器的比较函数的位置,实际上,' isNot'根本没有做到这一点。 ' this.isNot'可以在期望.prototype.wrapCompare' Expectation.prototype.wrapCompare'在Jasmine源本身内部运行,但真正需要的是我创建的自定义匹配器。

所以现在在这个wrapCompare函数中,我只是在' if'中添加了args.push语句。声明如下:

if (this.isNot) {
    //-- Added this line
    args.push(this.isNot);
    matcherCompare = matcher.negativeCompare || defaultNegativeCompare;
}

现在,调用匹配器,我可以这样做:

expect(investment).not.toBeAGoodInvestment();

然后实际的匹配器看起来像这样:

toBeAGoodInvestment: function () {
    return {
        compare: function (actual, isNot) {
            return {
                pass: actual.isGood(),
                message: 'Expected investment to be a ' + 
                   ((isNot) ? 'bad' :  'good') + ' investment'
            }
        }
    };
}

这里很好的小研究任务,以弄清楚Jasmine在幕后做了什么。

任何其他方式来获得' isNot'注入比较功能,请告诉我。