期望()断言失败时打印消息

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

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

41954 次浏览

更新

我看到人们还在找这个。Jasmine 团队后来提供的信息是,在这个期望中有一个没有文档说明的特性——你可以包含一个自定义的失败消息,它就是这样工作的:

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

这正是我最初想要的。

原答案如下 :

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

我们讨论的语法是 Jasmine 的一个扩展,允许添加一个 because,这样你就可以写:

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

几年后,这个问题仍在讨论之中,可能不会取得成果。我发现的另一种方法是创建一个自定义匹配器。一般情况下,我会劝阻自定义匹配器,而不确定它是否覆盖了所有的基础,但在这种情况下,我们实际上是在检查一个 true/false 值,所以匹配器并不太可怕。

我们可以创建一个自定义 matcher,其中包含:

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

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

是的,我们可以打印一个自定义错误消息时,一个期望()在 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');
});

其他的答案解释了如何破解“预期”,但是还有另外一种方法可以解决你的问题,尽管它需要你稍微转换一下思路。不要把“期望”想象成你在测试中的行为,而是把所有在一个“它”调用下的期望想象成你在测试中的行为。

我遇到这个问题最多的情况是,当我有一个函数正在进行某种密集的解析时,我想编写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);
});
});

您可以减少围绕测试飞行的无关代码的数量,并且可以为每个期望或一组期望设置消息的格式。

你可以用 失败方法来做。

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

Jasmine 3.3将 有上下文作为官方支持的方式来指定关于期望的附加信息,而不用担心您正在使用的匹配器。

更多信息和例子: 如何向匹配失败消息添加更多信息?

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

这是我用 TypeScript (Jasmine + Chutzpah in Visual Studio)为 Jasmine 2.6.4所使用的。

通过 NuGet 发布的最新 Jasmine 版本似乎是2.6.4,所以我没有使用“ withContext”(这样做似乎有点笨拙,我更喜欢像许多其他框架一样在匹配器的末端标记消息)。

尽管 jasmine.d.ts 类型中出现了“ pectationfalOutput”参数(要显示的消息) ,但似乎它并没有得到 jasmine 的正式支持:

然而,非正式地,它似乎对所有人都适用,除了“平等对手”。

我使用以下内容来添加一个全局的新 toBeEqualTo 匹配器,这是我从原始 toEqualmatcher 复制的,并简单地在末尾添加 pectationFalse Output 消息。接口声明位允许我们使用 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
};
}
};
}
});
});

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

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

未来:

  • 期望是真的,
  • 10000-等待时间
  • 自定义消息(根据我们的需求,我们可以在日志报告中写入 msg/error)

在 Jasmine 2. * 中,一个很好的解决方案是使用包 Jasmine2-定制信息:

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