Подтвердить что ты не робот

Печатать сообщение на wait() assert failure

Есть ли способ распечатать настраиваемое сообщение об ошибке при сбое Jasmine expect()?

В качестве примера, для сквозного тестирования у меня есть массив веб-страниц, и я использую один тест для перехода к каждому URL-адресу и утверждаю, что элемент существует на каждой странице. Я знаю, что могу поместить каждый expect() в отдельный тест, но я предпочел бы перебирать массив и регистрировать URL-адрес страницы при ошибке.

4b9b3361

Ответ 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');
});