【问题标题】:Jasmine - DRY test cases - print custom resultJasmine - DRY 测试用例 - 打印自定义结果
【发布时间】:2015-12-08 17:51:30
【问题描述】:

我正在写一个 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);
    }   
})

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

我想自定义输出,以便它告诉我葡萄属性失败。所以,我想这样做: 覆盖期望函数以某种方式打印如下内容:

Expected false to be true for grape

我知道我可以在描述中为每个属性使用单独的“it”块循环这些。但是,假设“obj”对象仅在 beforeEach 块中的初始化之后才可用,因此这不是我的选择。

有什么建议吗?

【问题讨论】:

    标签: jasmine


    【解决方案1】:

    您可以这样创建custom error message

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

    【讨论】:

    • 太棒了!这成功了。这在 Jasmine 文档中的某处提到过吗?好像没找到但是,谢谢兄弟的提示。
    • @Aneesh 是的,我认为它没有记录在案。
    【解决方案2】:

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

    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);
    });
    

    【讨论】:

    • 好建议!不过,好像有点绕。但是,我可以在其他一些情况下使用它。谢谢朋友。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多