Каким образом устройства доступа к данным 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