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

Javascript expect()断言失败时打印消息,javascript,testing,jasmine,protractor,Javascript,Testing,Jasmine,Protractor,当Jasmineexpect()失败时,是否有方法打印自定义错误消息 例如,对于端到端测试,我有一个web页面数组,我使用一个测试来访问每个URL并断言每个页面上存在一个元素。我知道我可以将每个expect()放入一个单独的测试中,但我宁愿遍历数组,并在失败时记录页面URL 更新 我看到人们仍然在寻找这个。Jasmine团队稍后提供的信息是,expect上有一个未记录的功能-您可以包含一条自定义失败消息,它可以正常工作: expect( fields[i].element.exists() ).

当Jasmine
expect()
失败时,是否有方法打印自定义错误消息


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

更新

我看到人们仍然在寻找这个。Jasmine团队稍后提供的信息是,expect上有一个未记录的功能-您可以包含一条自定义失败消息,它可以正常工作:

expect( fields[i].element.exists() ).toEqual(true, field[i].name + ' is expected to exist');
这正是我最初想要的

原始答案如下所示:

我今天一直在寻找这个,并在这里发表评论:

所讨论的语法是Jasmine的扩展,允许添加一个原因,因此您可以编写:

expect( fields[i].element.exists() ).toEqual(true).because( field[i].name + 'is expected to exist');
几年后,这一问题仍在讨论之中,可能不会有结果。我发现的另一种方法是创建自定义匹配器。一般来说,我认为我不鼓励使用自定义匹配器,但不确定是否覆盖了所有的基础,但在这种情况下,我们实际上是在检查真/假值,因此匹配器不会太可怕

我们可以使用beforeach创建自定义匹配器:

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记录自定义消息,并使用以下方法

beforeEach(function(){
    this.addMatchers({
        customError: function(mesg){
                         this.message= function () {
                                           return mesg;
                                       };
                         return this.actual == true;
                         }
                     });
        });
if(<fail condidtion>){
    expect(false).customError(<Fail message>)
}
beforeach(函数(){
这是addMatchers({
自定义错误:函数(mesg){
this.message=函数(){
返回mesg;
};
返回this.actual==true;
}
});
});
if(){
expect(false).customError()
}
请注意,我上面提到的是jasmine 1格式。如果您使用的是茉莉花2,将会有轻微的变化。
希望这对您有所帮助

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

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

其他答案解释了如何破解“expect”,但还有另一种方法可以解决您的问题,尽管它需要您稍微改变一下思路。不要将“期望”视为您的测试行为,而是将单个“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 3.3包括作为官方支持的方式来指定关于期望的附加信息,而不必担心您正在使用哪个匹配器。

由于Jasmine 3.3,有一种方法可以通过withContext来完成

例如:

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

另请参见

这是我在Jasmine 2.6.4中使用的TypeScript(Visual Studio中的Jasmine+Chutzpah)

通过NuGet发布的最新Jasmine版本似乎是2.6.4,因此我没有“withContext”功能(这样做似乎有点笨拙,我更喜欢像许多其他框架一样在matcher的末尾标记消息)

尽管jasmine.d.ts打字中存在“expectationFailOutput”参数(要显示的消息),但jasmine似乎并未正式支持该参数:

然而,非官方地说,它似乎对所有人都很好,除了toEqual matcher

我使用以下命令全局添加一个新的toBeEqualTo matcher,它是我从原始toEqual matcher复制的,只需将expectationFailOutput消息添加到末尾。接口声明位允许我们使用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
类型脚本实现:

/// <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
                    };
                }
            };
        }
    });
});
//
声明名称空间jasmine
{
接口匹配器
{
toBeEqualTo(预期:任意,预期失败输出?:任意):布尔值;
}
}
beforeach(函数()
{
茉莉花({
toBeEqualTo:函数(util、customEqualityTesters)
{
customEqualityTesters=customEqualityTesters | |[];
返回{
比较:功能(实际、预期、预期故障输出)
{
var diffBuilder=(jasmine.diffBuilder();
返回{
通过:util.equals(实际、预期、customEqualityTesters、diffBuilder),
消息:diffBuilder.getMessage()+“:”+expectationFailOutput
};
}
};
}
});
});
示例: 我需要在第一次加载时验证页面的颜色

expect(obj.color).toBe(true, 10000, 'Custom Message');
在托比:

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

了不起的发现!期望(某事)。托贝尔西(不应该…);工作顺利!当然,你应该把你的最新发现放在你的答案之上,这样它就可以直接访问了(剩下的作为历史日志放在下面)。Thx.从jasmine 3.3.0开始,它似乎与
toBe
一起工作,但与
toEqual
不一起工作,尽管有文档记录,但仍然与
toEqual
不一起工作。使用
toBe
可以测试在对象上失败的完全相同的值(可能是因为原型部分),因此仍然不适用
expect(obj.color).toBe(true, 10000, 'Custom Message');