在 expect() 断言失败时打印消息

Print message on expect() assert failure

本文关键字:打印 消息 失败 断言 expect      更新时间:2023-09-26

有没有办法在茉莉花expect()失败时打印自定义错误消息?

例如,对于端到端测试,我

有一个网页数组,我使用一个测试转到每个 URL 并断言每个页面上存在一个元素。 我知道我可以将每个expect()放入单独的测试中,但我宁愿遍历数组并在失败时记录页面 URL。

更新

我看到人们仍然在发现这个。 Jasmine 团队后来提供的信息是,预期中有一个未记录的功能 - 您可以包含自定义失败消息,它就可以工作:

expect( fields[i].element.exists() ).toEqual(true, field[i].name + ' is expected to exist');

这正是我最初想要的。

原答案如下

我今天一直在寻找这个,并在这里发表评论:https://github.com/adobe/brackets/issues/2752

已经讨论的语法是对 Jasmine 的扩展,允许添加 因为 - 所以你可以写:

expect( fields[i].element.exists() ).toEqual(true).because( field[i].name + 'is expected to exist');

几年后仍在讨论这个问题,可能不会取得成果。 我发现的另一种方法是创建自定义匹配器。 一般来说,我认为我不鼓励自定义匹配器,但不确定你用它覆盖了所有的基础,但在这种情况下,我们实际上是在检查真/假值,所以匹配器并不太可怕。

我们可以创建一个自定义匹配器,其中包含一个 beforeEach:

beforeEach(function() {
  var matchers = {
    toEqualBecause: function( value, message ) {
      this.message = function() {
        return "Expected '" + this.actual + "' to equal '" + value + "' because " + message;  
      };
      return this.actual == value;  
    }
 };
  this.addMatchers(matchers);
});

然后,我们可以使用此匹配器来放置一条包含失败的消息,如下所示:

expect( field[i].element.exists() ).toEqualBecause( true, field[i].name );

这将给出一个失败输出,包括字段名称如下:

Expected 'false' to equal 'true' because account_name

是的,我们可以在 Jasmine 中的 expect(( 失败时打印自定义错误消息。

 Code Snippet:
  it('print a custom error message when an expect failed', function() {
    var elemenToBeDisplayed=element(by.css("userName"));
    /*custom error message will be displayed if expected condition 
    failed*/
    expect(elemenToBeDisplayed.isPresent).toBe(true,'Write your custom       
         error message here');
   });

Jasmine 3.3 包含 withContext 作为官方支持的方式来指定有关期望的其他信息,而无需担心您正在使用哪个匹配器。

更多信息和示例:如何向匹配器故障消息添加更多信息?

it('has multiple expectations with some context', function() {
  expect(munge()).withContext('munge').toEqual(1);
  expect(spindle()).withContext('spindle').toEqual(2);
  expect(frobnicate()).withContext('frobnicate').toEqual(3);
});

从Jasmine 3.3开始,有一种方法可以通过Context来实现

例:

expect(someValue).withContext('expected someValue to be true...').toBe(true)

另请参阅 https://github.com/jasmine/jasmine/issues/641#issuecomment-457037665

你可以

用fail((方法做到这一点。

it('should fail with a message', function() {    
  if (!foo) fail(`your message here`);
});

其他答案解释了如何破解"期望",但还有另一种方法可以解决你的问题,尽管它需要你稍微改变一下思路。 不要将"期望"视为您被测试的行为,而将单个"it"调用下的所有期望视为您被测试的行为。

我遇到这个问题最多的情况是,当我有一个正在执行某种密集解析的函数时,我想编写 20 个几乎相同的测试。

按如下方式排列输入和输出:

var testDatas = [
  {
    input: 'stringtoparse1',
    output: 'String To Parse 1'
  },
  {
    input: 'stringtoparse2',
    output: 'String To Parse 2'
  },
  {
    input: 'stringtoparse3',
    output: 'String To Parse 3'
  },
];

现在遍历测试数据列表,并从循环内部调用"it",如下所示:

testDatas.forEach(function(test) {
  it('should parse for input ' + test.input, function() {
    expect(myParser(test.input).toEqual(test.output);
  });
});

您可以减少在测试中飞来飞去的无关代码的数量,并且可以为每个期望或一组期望格式化消息。

我需要为 Jasmine 记录自定义消息,我使用了以下方法。

beforeEach(function(){
    this.addMatchers({
        customError: function(mesg){
                         this.message= function () {
                                           return mesg;
                                       };
                         return this.actual == true;
                         }
                     });
        });
if(<fail condidtion>){
    expect(false).customError(<Fail message>)
}

请注意,我上面提到的是茉莉花 1 格式。如果您使用的是茉莉花 2,则会略有变化。希望这对你有帮助

这就是

我用TypeScript(Visual Studio中的Jasmine+Chutzpah(在Jasmine 2.6.4中使用的内容。

通过 NuGet 的最新 Jasmine 版本似乎是 2.6.4,所以我没有"withContext"的东西(这似乎也是一种笨拙的方法,我更喜欢像许多其他框架一样在匹配器的末尾标记消息(。

尽管"expectationFailOutput"参数(要显示的消息(存在于jasmine.d.ts类型中,但似乎茉莉花并不正式支持它:

  • https://github.com/jasmine/jasmine/issues/1457
  • https://github.com/jasmine/jasmine/issues/1682

但是,非正式地,它似乎适用于所有人,除了 toEqual 匹配器。

我使用以下命令全局添加新的 toBeEqualTo 匹配器,该匹配器是从原始 toEqual 匹配器复制的,只需将期望失败输出消息添加到末尾。接口声明位允许我们使用 expect(...(。toBeEqualTo(...( 没有 TypeScript 抱怨。

用法示例:

expect(x).toBe(y, "Some Message"); // stock message works with .toBe
expect(x).toEqual(y, "This is ignored"); // stock message ignored with .toEqual
expect(x).toBeEqualTo(y, "My message is displayed"); // new matcher added below

TypeScript 实现:

/// <reference path="../../Scripts/typings/jasmine/jasmine.d.ts"/>
declare namespace jasmine
{
    interface Matchers
    {
        toBeEqualTo(expected: any, expectationFailOutput?: any): boolean;
    }
}
beforeEach(function ()
{
    jasmine.addMatchers(<any>{
        toBeEqualTo: function (util, customEqualityTesters)
        {
            customEqualityTesters = customEqualityTesters || [];
            return {
                compare: function (actual, expected, expectationFailOutput)
                {
                    var diffBuilder = (<any>jasmine).DiffBuilder();
                    return {
                        pass: util.equals(actual, expected, customEqualityTesters, diffBuilder),
                        message: diffBuilder.getMessage() + ": " + expectationFailOutput
                    };
                }
            };
        }
    });
});

示例:我需要在第一次加载时验证页面的颜色。

expect(obj.color).toBe(true, 10000, 'Custom Message');

在托比:

  • 真 - 预期为真,
  • 10000 - 等待时间
  • 自定义消息(根据我们的要求,我们可以在日志报告中写入消息/错误(

在 Jasmine 2.* 上,一个不错的解决方案是使用 Jasmine2-custom-message 包。它允许使用干净的语法,例如:

since(() => `${field[i].name} is expected to exist`)
  .expect(fields[i].element.exists()).toEqual(true);