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

use*_*049 52 javascript testing jasmine protractor

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

作为一个例子,对于端到端测试我有一个网页数组,我使用一个测试来转到每个URL并断言每个页面上存在一个元素.我知道我可以把每个人都expect()放到一个单独的测试中,但我宁愿遍历数组并在失败时记录页面URL.

Pau*_*ulL 59

UPDATE

我看到人们仍然在发现这一点.来自Jasmine团队的后来信息是,期望有一个未记录的功能 - 您可以包含自定义失败消息,它只是起作用:

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

这正是我最初想要的.

原始答案如下:

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

已讨论的语法是Jasmine的扩展,允许添加因为 - 因此您可以编写:

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

这种情况在几年后仍在讨论中,可能无法实现.我发现这样做的另一种方法是创建自定义匹配器.一般来说,我认为我不鼓励自定义匹配器,但不确定你是否覆盖了它的所有基础,但在这种情况下,我们确实检查了真/假值,所以匹配器并不太可怕.

我们可以使用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);
});
Run Code Online (Sandbox Code Playgroud)

然后,我们可以使用此匹配器来发送包含我们失败的消息:

expect( field[i].element.exists() ).toEqualBecause( true, field[i].name );
Run Code Online (Sandbox Code Playgroud)

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

Expected 'false' to equal 'true' because account_name
Run Code Online (Sandbox Code Playgroud)


Opt*_*rks 30

是的,我们可以在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');
   });
Run Code Online (Sandbox Code Playgroud)

  • 尼斯.同样的技巧似乎对`toEqual`不起作用.有没有在那里解决? (6认同)
  • 虽然此语法目前有效,但未记录,应谨慎使用. (2认同)

Hol*_*min 16

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


Ern*_*iks 5

从 Jasmine 3.3 开始,有一种方法可以通过 withContext 做到这一点

例子:

expect(someValue).withContext('expected someValue to be true...').toBe(true)
Run Code Online (Sandbox Code Playgroud)

另见https://github.com/jasmine/jasmine/issues/641#issuecomment-457037665

  • 嘿,@ernstjan,我正在使用 jasmine 3.3.1,我写了 `expect(true).withContext("reason").toBe(false);` 并且我得到 `Failed: expect(...).withContext 是不是函数`。任何想法为什么会发生? (3认同)