Как передать настраиваемое сообщение об ошибке в jasmine matcher?
Во всех средах тестирования, которые я использовал, есть необязательный параметр, чтобы указать собственное пользовательское сообщение об ошибке.
Это может быть очень полезно, и я не могу найти способ сделать это из коробки с жасмином.
У меня было 3 других разработчика, которые спрашивают меня об этой точной функциональности, и когда дело доходит до жасмина, я не знаю, что им сказать.
Можно ли указать собственное сообщение об ошибке для каждого утверждения?
Ответы
Ответ 1
Если вы посмотрите на исходный код жасмина, вы увидите, что невозможно установить сообщение извне. Например, toBeNaN
.
/**
* Matcher that compares the actual to NaN.
*/
jasmine.Matchers.prototype.toBeNaN = function() {
this.message = function() {
return [ "Expected " + jasmine.pp(this.actual) + " to be NaN." ];
};
return (this.actual !== this.actual);
};
Как вы можете видеть, сообщения жестко закодированы в матчи и будут установлены, когда вы вызываете соединитель. Единственный способ, с помощью которого я могу придумать свои собственные сообщения, - написать свой матчи, как описано здесь
Ответ 2
Добавлен необязательный параметр для всех совпадений (toBe, toContain и другие), поэтому вы можете использовать:
expect(true).toBe(false, 'True should be false').
Затем в выводе он будет выглядеть следующим образом:
Message:
Expected true to be false, 'True should be false'.
Ссылка на фиксацию (это не описано в документации):
https://github.com/ronanamsterdam/DefinitelyTyped/commit/ff104ed7cc13a3eb2e89f46242c4dbdbbe66665e
Ответ 3
Эта проблема отслеживает интерес к реализации пользовательских сообщений об ошибках с использованием механизма .because()
.
Тем временем avrelian создал красивую библиотеку, которая реализует собственные сообщения об ошибках с использованием механизма since()
- jasmine-custom-message
.
Ответ 4
Вы можете определить пользовательский соединитель в глобальной области действия, переопределив сообщение об ошибке в жасмине, как показано ниже:
beforeEach(function () {
jasmine.addMatchers({
toReport: function () {
return {
compare: function (actual, expected, msg) {
var result = {pass: actual == expected};
result.message = msg;
return result;
}
}
}
});
});