Печатать сообщение на wait() assert failure
Есть ли способ распечатать настраиваемое сообщение об ошибке при сбое Jasmine expect()
?
В качестве примера, для сквозного тестирования у меня есть массив веб-страниц, и я использую один тест для перехода к каждому URL-адресу и утверждаю, что элемент существует на каждой странице. Я знаю, что могу поместить каждый expect()
в отдельный тест, но я предпочел бы перебирать массив и регистрировать URL-адрес страницы при ошибке.
Ответы
Ответ 1
ОБНОВИТЬ
Я вижу, что люди все еще находят это. Более поздняя информация от команды 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');
Это все еще обсуждается через несколько лет и, возможно, не осуществится. Еще один способ, который я нашел для этого, - создать собственный сопоставитель. В общем, я думаю, что я бы не одобрял пользовательское сопоставление, не будучи уверенным, что вы покрываете все базы с ним, но в этом случае мы действительно проверяем значение true/false, поэтому сопоставление не слишком страшно.
Мы можем создать собственный сопоставитель с 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
Ответ 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');
});
Ответ 3
Другие ответы объясняют, как взломать "ожидание", но есть другой подход, который может решить вашу проблему, хотя для этого вам нужно немного перевернуть свое мышление. Вместо того, чтобы думать о "ожидании" как о вашем тестируемом поведении, подумайте обо всех ожиданиях под одним "его" вызовом в качестве тестируемого вами поведения.
В случае, когда я столкнулся с этой проблемой, большинство из них - это когда у меня есть функция, которая проводит какой-то интенсивный синтаксический анализ, и я хочу написать 20, почти идентичных тестов.
Расположите свои входы и выходы следующим образом:
var testDatas = [
{
input: 'stringtoparse1',
output: 'String To Parse 1'
},
{
input: 'stringtoparse2',
output: 'String To Parse 2'
},
{
input: 'stringtoparse3',
output: 'String To Parse 3'
},
];
Теперь перебираем список ваших тестовых данных и вызываем "он" из внутри в цикле следующим образом:
testDatas.forEach(function(test) {
it('should parse for input ' + test.input, function() {
expect(myParser(test.input).toEqual(test.output);
});
});
Вы можете уменьшить количество постороннего кода, пролетающего вокруг ваших тестов, и вы можете форматировать сообщение для каждого ожидания или группы ожиданий.
Ответ 4
Jasmine 3.3 включает в себя withContext как официально поддерживаемый способ указать дополнительную информацию об ожидании, не беспокоясь о том, какое совпадение вы используете.
Ответ 5
У меня было требование регистрировать пользовательские сообщения для 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, будет небольшое изменение.
Надеюсь, это полезно для вас.
Ответ 6
Вы можете сделать это с помощью метода fail().
it('should fail with a message', function() {
if (!foo) fail('your message here');
});
Ответ 7
Начиная с Jasmine 3.3, есть способ сделать это с помощью контекста
Пример:
expect(someValue).withContext('expected someValue to be true...').toBe(true)
Смотрите также https://github.com/jasmine/jasmine/issues/641#issuecomment-457037665