在 expect() 断言失败时打印消息
Print message on expect() assert failure
有没有办法在茉莉花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);
- 如何在服务器控制台上打印前端日志消息
- 尝试从对象打印出响应消息
- page.evaluate() 未打印控制台消息
- 使用javascript在HTML的输出窗口中打印控制台消息
- 返回 false 不会停止刷新页面,并且不打印错误消息
- JSON 响应打印 HTML 而不是消息
- 从javascript打印或回显html页面中的消息
- 有没有其他方法可以在不对 javascript 中的内容进行换行的情况下打印出调试消息
- 如何在控制台中打印来自在 gulp-run 中执行的进程的消息
- 删除消息选择打印机并使用javascript自动打印文档
- 从父对象内部的相邻对象打印对象会导致'未定义'消息
- 为什么我'我无法在AJAX响应中打印错误消息
- 如何在async nodejs中完成所有流程并打印出消息
- 无法根据时间打印消息
- 如何打印带有标签的HTML消息
- 在指定的函数中不打印Javascript控制台消息
- 试图打印消息在我的无序列表框jQuery
- 在打印的JavaScript代码中隐藏消息(待查找)
- 在 expect() 断言失败时打印消息
- 如何使用try, catch在错误处理中打印消息