Каким образом устройства доступа к данным ember объявляются с помощью ic-ajax, например, методе tifyreFixture?

Я пытаюсь использовать ember-cli а также ember-cli-ic-ajax для светильников Ember Data. Я импортировал ic.ajax.defineFixture как icDefineFixture,

icDefineFixture('/users', {
  response: {
    email: 'user@example.com'
  },
  textStatus: 'success',
  jqXHR: {}
});

Который не выдает никаких ошибок, поэтому я знаю, что импортирую функцию успешно. Затем я создаю запись, которая идет хорошо:

this.store.createRecord('user', {});

Но когда я пытаюсь сохранить его в действии контроллера:

this.get('model').save().then(function() { ... });

Я получаю 404 ошибки, потому что данные ember связываются с моим сервером, который не имеет бэкэнда при тестировании.

Я озадачен, как Ember Data должен знать, чтобы использовать ajax-методы ic-ajax. Это то, что я должен настроить вручную? Мне не удалось найти какую-либо документацию по этому вопросу.

Спасибо!

3 ответа

Решение

Спасибо @ToddSmithSalter за предложение, которое привело меня к решению, которое оказалось очень хорошим для моего случая. Я смог просто снова открыть свой адаптер в файле, который загружен только в моем наборе тестов, и переопределить метод ajax:

ApplicationAdapter.reopen({
  ajax: function(url, verb, hash) {
    icRequest(url)
  }
});

Куда я ввозил ic.ajax.request как icRequest

Кажется, это работает нормально, но я не вижу способа зарегистрировать приборы отдельно для каждого типа запроса. PUT, GET, POST, DELETE, так далее.

Благодаря комментарию @kevin-bullaughey мне удалось настроить решение для Ember CLI 0.2.0-beta.1:

import DS from 'ember-data';

import ENV from '../config/environment';
import { request } from 'ic-ajax';

var ApplicationAdapter = DS.RESTAdapter.extend();

if (ENV.environment === "test") {
    ApplicationAdapter.reopen({
        ajax: function(url) {
            return request(url);
        }
    });
}

export default ApplicationAdapter;

в test среда адаптер будет использовать определенный ic-ajax Светильники и ведут себя без изменений в development или же production,

Я не верю, что ember-data вообще использует ic-ajax, но jQuery.ajax. В приложении, которое я сейчас пишу, я использую ic-ajax вместо $.ajax просто потому, что он возвращает обещания RSVP. Сейчас я делаю запросы без ember-данных.

Вот пример из источника Ghost, где ic-ajax использовался для отправки запросов.

Установка: https://github.com/TryGhost/Ghost/blob/master/core/client/utils/ajax.js
Использование: https://github.com/TryGhost/Ghost/blob/master/core/client/controllers/setup.js#L23

Что касается светильников, из ic-ajax readme Github:

Добавление приборов с помощью defineFixture указывает ic-ajax разрешить обещание с приспособлением, соответствующим URL-адресу, а не делать запрос. Это позволяет вам тестировать ваше приложение, не создавая поддельные серверы с помощью sinon и т. Д.

Example:

ic.ajax.defineFixture('api/v1/courses', {
  response: [{name: 'basket weaving'}],
  jqXHR: {},
  textStatus: 'success'
});

ic.ajax.request('api/v1/courses').then(function(result) {
  deepEqual(result, ic.ajax.lookupFixture('api/v1/courses').response);
});

Теперь, если вы хотите использовать ic-ajax с данными ember, вы можете переопределить методы createRecord, deleteRecord на используемом адаптере. Посмотрите этот документ API Ember о createRecord, чтобы узнать, как ember-data выполняет вызовы ajax: http://emberjs.com/api/data/classes/DS.Adapter.html

Другие вопросы по тегам