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

Тестирование модели отношения позвоночника с использованием жасмина

Предположим, что у меня есть два простых файла привязки: один для пользователя (1) и один для сообщений (2).

Модель базовой линии для сообщений следующая (3).

Если я загружаю "Message Fixture", я хотел бы также иметь соответствующую информацию о пользователе, указанную в модели сообщений.
Каков правильный способ активировать эту цель в представлении спецификации (4) с помощью набора тестов жасмина?
Подробнее см. Комментарии в (4).


(1)

// User Fixture
beforeEach(function () {
    this.fixtures = _.extend(this.fixtures || {}, {
        Users: {
            valid: {
                status: 'OK',
                version: '1.0',
                response: {
                    users: [
                        {
                            id: 1,
                            name: 'olivier'
                        },
                        {
                            id: 2,
                            name: 'pierre',
                        },
                        {
                            id: 3,
                            name: 'george'
                        }
                    ]
                }
            }
        }
    });
});

(2)

// Message Fixture
beforeEach(function () {
    this.fixtures = _.extend(this.fixtures || {}, {
        Messages: {
            valid: {
                status: 'OK',
                version: '1.0',
                response: {
                    messages: [
                        {
                            sender_id: 1,
                            recipient_id: 2,
                            id: 1,
                            message: "Est inventore aliquam ipsa"
                        },
                        {
                            sender_id: 3,
                            recipient_id: 2,
                            id: 2,
                            message: "Et omnis quo perspiciatis qui"
                        }
                    ]
                }
            }
        }
    });
});

(3)

// Message model

MessageModel = Backbone.RelationalModel.extend({
    relations: [
        {
            type: Backbone.HasOne,
            key: 'recipient_user',
            keySource: 'recipient_id',
            keyDestination: 'recipient_user',
            relatedModel: UserModel
        },
        {
            type: Backbone.HasOne,
            key: 'sender_user',
            keySource: 'sender_id',
            keyDestination: 'sender_user',
            relatedModel: UserModel
        }
    ]
});

(4)

// Spec View

describe('MyView Spec', function () {
        describe('when fetching model from server', function () {
            beforeEach(function () {
                this.fixture = this.fixtures.Messages.valid;
                this.fixtureResponse = this.fixture.response.messages[0];
                this.server = sinon.fakeServer.create();
                this.server.respondWith(
                    'GET',
                    // some url
                    JSON.stringify(this.fixtureResponse)
                );
            });
            it('should the recipient_user be defined', function () {
                this.model.fetch();
                this.server.respond();
                // this.fixtureResponse.recipient_user is not defined 
                // as expected by the relation defined in (3)
                expect(this.fixtureResponse.recipient_user).toBeDefined();
            });
        });
    });
});
4b9b3361

Ответ 2

this.fixtureResponse - это исходные данные для модели, но когда модель фактически создана, она копирует эти данные во внутреннее свойство. Поэтому, когда Backbone Relational разрешает отношение, он не должен изменять исходный объект данных.

Вы пробовали с помощью expect(this.model.get('recipient_user')).toBeDefined()?

Ответ 3

Backbone-Relational предоставляет возможность либо создавать связанную модель с вложенными объектами внутри JSON, полученными с помощью модели выборки, либо с помощью моделей с ленивой загрузкой, используя fetchRelated.

Вы предоставляете Backbone-Relational с данными модели сообщений, но не можете получить данные модели пользователя. Вы можете добавить еще один ответ, возвращающий соответствующие связанные пользовательские данные, и вызвать fetchRelated в модели сообщений.

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