Jasmine - DRY测试用例 - 打印自定义结果

时间:2015-09-12 06:16:30

标签: jasmine

我正在编写一个Jasmine测试(此处简化示例),需要验证类似的事情。

让我们说一个对象:

var obj = {
    apple: true,
    banana: true,
    grape: false,
    lemon: true
}

我的测试是验证obj的所有属性都是真的。

所以我写道:

it('should have all properties as true.', function(){
    for(var i in obj){
        expect(obj[i]).toBe(true);
    }   
})

现在,当这个测试运行时,它将失败,因为葡萄是假的。但是,输出并没有告诉我哪个属性(葡萄)失败了。

我想自定义输出,以便它告诉我葡萄属性失败了。所以,我想这样做: Over-ride期望函数以某种方式打印这样的东西:

Expected false to be true for grape

我知道我可以在个人的描述中循环这些'它'每个属性的块。但是,让我们说“对象”。只有在beforeEach块中初始化后,对象才可用,因此这对我来说不是一个选项。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式创建custom error message

for(var i in obj){
    expect(obj[i]).toBe(true, "Expected '" + obj[i] + "' to be true");
} 

答案 1 :(得分:0)

您可以像这样编写自定义匹配器:

beforeEach(function () {
  jasmine.addMatchers({
    toBeAll: function () {
      return {
        compare: function (obj, expected) {
          var failedProps = [];
          for (var prop in obj) {
            if (obj[prop] != expected) {
              failedProps.push(prop);
            }
          }
          var result = {
            pass: true
          };
          if (failedProps.length > 0) {
            result.pass = false;
            result.message = "Expected '"+failedProps.join("' & '")+"' to be " + expected;
          }
          return result;
        }
      };
    }
  });
});

it('should have all properties as true.', function () {
  expect(obj).toBeAll(true);
});