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

时间:2014-04-23 18:00:31

标签: javascript testing jasmine protractor

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

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

9 个答案:

答案 0 :(得分:50)

<强>更新

我看到人们仍然在发现这一点。来自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

答案 1 :(得分: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');
   });

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我需要记录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>)
}

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

答案 4 :(得分:1)

其他答案解释了如何破解&#39;期望&#39;但是还有另一种方法可以解决您的问题,尽管它需要您稍微改变您的想法。而不是想到&#39;期待&#39;作为您正在接受测试的行为,请考虑单个&#39;它的所有期望。称之为你的测试行为。

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

安排输入和输出如下:

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

现在迭代您的测试数据列表,然后调用它&#39;它&#39;来自内部循环如此:

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

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

答案 5 :(得分:1)

您可以使用fail()方法执行此操作。

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

答案 6 :(得分:0)

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

示例:

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

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

答案 7 :(得分:0)

这就是我用TypeScript(Visual Studio中的Jasmine + Chutzpah)使用Jasmine 2.6.4的原因。

通过NuGet的最新Jasmine版本似乎是2.6.4,所以我没有“ withContext”(看起来也很笨拙,我更喜欢在最后标记一条消息)就像许多其他框架一样。

即使在键入的jasmine.d.ts中存在“ expectationFailOutput”参数(要显示的消息),它似乎也不受jasmine的正式支持:

但是,非正式地,对于toEqual匹配器之外的所有用户似乎都可以正常工作。

我使用以下命令全局添加了一个新的toBeEqualTo匹配器,该匹配器是从原始toEqual匹配器复制而来的,只是在最后添加了ExpectationFailOutput消息。接口声明位使我们可以在没有TypeScript抱怨的情况下使用Expect(...)。toBeEqualTo(...)。

用法示例:

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

答案 8 :(得分:0)

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

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

在 toBe:

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