2015-04-27 2 views
0

Я пытаюсь написать пользовательский Matcher, который проверяет, содержит ли строка определенное количество вхождений другой строки. Это то, что я сделал.Как написать пользовательский матчи Jasmine

var matcher = { 
    toContainTimes: function (expected, num) { 
     return { 
      compare: function(actual){ 
       actual.match(new RegExp(expected, "g") || []).length == num; 
      } 
     } 
    } 
} 

Но я получаю сообщение об ошибке при выполнении этого:

TypeError: Cannot read property 'pass' of undefined 

Мой тест выглядит следующим образом:

expect(queryString).toContainTimes("&", 2); 

Она должна возвращать истину, если происходит строка «&» ровно в два раза Строка запроса. Что я сделал не так?

+0

Вы не 'return' ничего из вашей согласовани. – zerkms

ответ

3

От Jasmine Документов.

«Функция сравнения должна возвращать результат объекта с ударом свойством, что является булева результата согласовани Свойство прохода говорит Ожидалось ли сличитель успешным (истинным) или неудачным (ложным) ».

Вы должны вернуть объект с объявленными свойствами.

Попробуйте это:

var matcher: { 
    toContainTimes: function() { 
     return { 
      compare: function(actualValue, expectedResult){ 
       var expected = expectedResult[0]; 
       var num = expectedResult[1]; 
       var result = { 
        pass: true, 
        message: '' 
       } 
       result.pass = actualValue.match(new RegExp(expected, "g") || []).length === num; 

       if(!result.pass) 
        result.message = 'insert error message here. this will shown when the jasmine spec failed'; 

       return result; 
      } 
     } 
    } 
} 

Использование: expect(queryString).toContainTimes(["&", 2]);

+0

спасибо, это то, что я искал. – Garrarufa

 Смежные вопросы

  • Нет связанных вопросов^_^