Jasmine - 如何编写自定义匹配器来加总两个数字?

时间:2017-05-19 13:26:20

标签: javascript jasmine

我正在使用Jasmine 2.1.3并尝试创建一个自定义匹配器来对两个数字求和。

但是我得到了:

Expected 24 not to equal 12

到目前为止我已经

it("is 24 for 24", function() {
  result = simpleMath.sum_of(12,12); // gets 24
  expect(result).toBeSumOf([12,12]);
}); 

  beforeEach(function() {
    simpleMath = new SimpleMath();
    jasmine.addMatchers({
      toBeSumOf: function (util, customEqualityTesters) {
        return {
          compare: function(actual, expected) {
            // var passed = actual == expected  // comparison example that worked
            var passed = (actual[0]+actual[1]) == expected;
            return {
              pass: passed,
              message: 'Expected ' + actual + (passed ? '' : ' not') + ' to equal ' + expected
            };
          }
        };
      }
    });
  });

1 个答案:

答案 0 :(得分:1)

您的实际和预期是错误的方式,只需添加:

console.log(actual);
console.log(expected);

对于您的匹配器,您会看到,您可以使用参数12,12或[12,12]的任一格式,但对于前者,您需要添加另一个参数,因此阵列格式可能更可取。你当然可以使用一个对象,如果这有助于更复杂的比较/匹配。

工作(基于数组)示例:

describe("My custom test", function() {
  it("should work", function() {
      var result = 12 + 12;
      expect(result).toBeSumOf([12, 12]);
  });
});

beforeEach(function () {
  jasmine.addMatchers({
    toBeSumOf: function () {
      return {
        compare: function (actual, expected) {

            var passed = (actual == expected[0] + expected[1]);
            return {
              pass: passed,
              message: 'Expected value ' + (expected[0] + expected[1]) + (passed ? '' : ' not') + ' equal to ' + actual
            };
        }
      };
    }
  });
});

给出:

Pass!

更改其中一个值会产生:

Fail!