Вывод теста Backbone.View отличается от вывода консоли

Я не понимаю операции Backbone.View.render() и .el. В render() я назначаю this.el свойства, поддерживающие вывод, который я ожидаю увидеть, эти свойства находятся в this.el при тестировании, а .el возвращает ожидаемый вывод в консоли. Но вывод не появляется в тестировании.

Вот код и тест (пожалуйста, не обращайте внимания на грубость, я учусь и изо всех сил стараюсь, чтобы тесты оставались зелеными):

var RowLabelData = Backbone.Model.extend({});

var RowLabel = Backbone.View.extend({
    initialize: function() {
           this.for_attr = this.model.get("for_attr");
           this.text_val = this.model.get("text_val");
           this.el.setAttribute("for", this.for_attr);
        },

    render: function() {
        $(this.el).html(this.text_val);
        return this;
        }
});

Я тестирую QUnit следующим образом:

test_row_data   =   new RowLabelData({
                        for_attr: "id_username",
                        text_val: "Username:"
                    });
test_row_v      =   new RowLabel({
                        model: test_row_data,
                        tagName: 'label'
                    });
test_row_v.render();
test_row = test_row_v.el;

equal(test_row.textContent, "Username:");
equal(test_row.getAttribute("for"), "id_username");
// FAILS:
equal(test_row, '<label for="id_username">Username:</label>');

QUnit говорит, что в последнем тесте ‹‹ test_row >> возвращает <label></label>. НО в консоли JavaScript ‹‹ test_row >> возвращает строку, ожидаемую в тексте.

В основных документах говорится, что render() должен помещать желаемый HTML в el, но я пытаюсь использовать поведение render() по умолчанию, и оно работает в консоли. Почему не работает в тесте?


person chernevik    schedule 03.11.2011    source источник
comment
Я думаю, что неправильная часть - это то, как вы проверяете равенство. Текстовое содержимое и атрибут for присутствуют, как показывают первые два «равно». Я предполагаю, что сериализация элемента в строку для равенства не включает другие элементы, кроме имени тега.   -  person dira    schedule 03.11.2011


Ответы (1)


dira прав, проблема в сравнении объекта со строкой.

Этот тестовый код создает аналогичный элемент, а затем преобразует его и тестовый объект в строки для сравнения:

new_label = document.createElement("label");
new_label.setAttribute("for", "id_username");
t = document.createTextNode("Username:");
new_label.appendChild(t);

equal(
    $('<div>').append($(test_row).clone()).remove().html(),
    $('<div>').append($(new_label).clone()).remove().html(),
    "convoluted!"
);

Это проходит. Консольный вывод этих заклинаний, достойных Ктулху, — "<label for="id_username">Username:</label>".

Хотя он приближается к тем вещам, которые человек не должен знать, смелый или безрассудный может открыть этот тайный секрет здесь .

person chernevik    schedule 03.11.2011