Значения цветов RGB / RGBA в Транспортире
История:
В нескольких местах нашей тестовой кодовой базы мы утверждаем, что различные значения CSS равны ожидаемым значениям. Как правило, это color
, background-color
, font
связанные свойства стиля, или cursor
. Этот вопрос касается работы с цветами.
Вот пример рабочего теста, который в настоящее время проходит:
describe("AngularJS home page", function () {
beforeEach(function () {
browser.get("https://angularjs.org/");
});
it("should show a blue Download button", function () {
var downloadButton = element(by.partialLinkText("Download"));
expect(downloadButton.getCssValue("background-color")).toEqual("rgba(0, 116, 204, 1)");
});
});
Он проверяет, что кнопка загрузки на веб-сайте AngularJS имеет значение 0, 116, 204, 1
RGBA.
Теперь, если цвет изменится, тест будет потерпеть неудачу, как, например:
Expected 'rgba(0, 116, 204, 1)' to equal 'rgba(255, 116, 204, 1)'.
Задачи:
-
Как видите, во-первых, само ожидание не вполне читаемо. Пока мы не поместим комментарий рядом с ним, не очевидно, какой цвет мы ожидаем увидеть.
-
Кроме того, сообщение об ошибке не является информативным. Неясно, что такое реальный цвет и какой цвет мы ожидаем увидеть.
Вопрос:
Можно ли улучшить проверьте себя и сообщение об ошибке, чтобы быть более читаемым и информативным и работать названия цветов вместо цвета RGB / RGBA значения ?
желаемое ожидание :
expect(downloadButton).toHaveBackgroundColor("midnight blue");
желаемые сообщения об ошибках :
Expect 'blue' to equal 'black'
Expect 'dark grey' to equal 'light sea green'
В настоящее время я думаю о создании пользовательского сопоставления jasmine, которое преобразует значение RGB/RGBA
в пользовательский объект Color
, который сохранит исходное значение, а также определит ближайший цвет. color
пакет npm выглядит очень многообещающе.
Был бы признателен за любые намеки.
2 ответа:
Транспортир используетJasmine в качестве основы тестирования по умолчанию и обеспечивает механизм добавления пользовательскихожиданий .
Итак, вы можете сделать что-то вроде этого:
В конфигурационном файле транспортира:
var customMatchers = { toHaveBackgroundColor: function(util, customEqualityTesters) { compare: function(actual, expected) { result.pass = util.equals(extractColor(actual), convertToRGB(expected), customEqualityTesters); result.message = 'Expected ' + actual + ' to be color ' + expected'; } } } jasmine.addMatchers(customMatchers); function convertToRGB(color) { // convert a named color to rgb } function extractColor(domElement) { // extract background color from dom element }
И использовать его:
Я не пробовал этого, но это основная идея того, что вам нужно.expect(downloadButton).toHaveBackgroundColor("midnight blue");
Я получил рабочий ответ, основанный на рекомендациях @Andrew и @Manasov.
Таким образом, пользовательское ожидание будет выглядеть следующим образом:
var nameColor = require('name-that-color/lib/ntc'); var rgbHex = require('rgb-hex'); toHaveColor: function() { return { compare: function (elem, color) { var result = {}; result.pass = elem.getCssValue("color").then(function(cssColor) { var hexColor = rgbHex(cssColor); var colorName = nameColor.name('#' + hexColor.substring(0, 6).toUpperCase()); result.message = "Expect '" + colorName[1] + "' to equal '" + color + "'"; return colorName[1] === color; }); return result; } } }
Нам нужно сначала установить необходимые пакеты:
Сначала нам нужно преобразовать цветnpm install name-that-color npm install rgb-hex
rgb
в шестнадцатеричный. Кроме того, мы должны удалить Альфа из цвета дляname-that-color
, чтобы фактически сопоставить его с именем цвета, он может быть удален из преобразованияhex
.Теперь мы можем просто назвать его так:
expect(downloadButton).toHaveColor("midnight blue");