如何在 Mocha 中实现 addMatchers?

How do I implement addMatchers in Mocha?

我正在阅读使用 Jasmine 教授 BDD 的《使用 CoffeScript 进行测试》一书,但我使用的是 Mocha/Chai,并遇到了这段代码:

beforeEach -> 
  @addMatchers  
    toBeDiscounted: (orig,discount) ->  
      actual = @actual  
      @message = -> "Expected #{actual} to be #{discount}% of #{orig}"  
      actual is (orig * (1-(discount/100)))  

然后在测试中:

it "should persist the discount", ->  
  expect(test.basket.applyDiscount(10)).toBeDiscounted(50, 10)  

我如何在 Mocha/Chai 中执行此操作?

Jasmine 匹配器相当于 Chai Helpers 在 Mocha/Chai 土地上。
您将需要更新您的规范助手以包含 Custom Chai Helper。然后,您需要编写 Chai Helper 本身;使其扩展 Chai 以添加 discounted 函数。

spec/spec-helper.js

var chai = require('chai');

var chaiDiscounted = require('./helpers/discounted.js')
chai.use(chaiDiscounted);

spec/helpers/discounted.js

function discount(x, discount) {
  return x * (1 - (discount / 100));
}

module.exports = function(chai) {
  var Assertion = chai.Assertion;

  Assertion.addMethod('discounted', function (y, p) {
    var obj = this._obj;
    new Assertion(obj).to.be.a('number');
    this.assert(
        obj === discount(y, p)
      , "expected #{this} to be " + y + "% of " + p
      , "expected #{this} to not be " + y + "% of " + p
    );
  });
}

然后您应该能够做到:

expect(foo).to.be.discounted(50, 10)

抱歉,我还没有测试过。另外,我很抱歉这是在 Javascript(不是 Coffeescript)中...但希望它能帮助您指明正确的方向。