如何使用ic-ajax的declareFixture声明ember数据访问夹具?

时间:2014-09-16 21:27:41

标签: ember.js ember-data ember-cli ic-ajax

我正在尝试将ember-cliember-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如何知道使用ic-ajax的ajax方法。这是我必须手动设置的吗?我没有设法找到任何文件。

谢谢!

3 个答案:

答案 0 :(得分:1)

我不相信ember-data完全使用ic-ajax,而是jQuery.ajax。在我正在编写的应用程序中,我使用的是ic-ajax而不是$ .ajax,只是因为它返回了RSVP的承诺。现在,我正在提出没有余烬数据的请求。

以下是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 Github自述文件:

  

使用defineFixture添加灯具告诉ic-ajax解决了与灯具匹配而不是发出请求的灯具的承诺。这允许您测试您的应用程序,而无需使用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-data一起使用,你可以覆盖你正在使用的Adapter上的createRecord,deleteRecord方法。有关ember-data如何进行ajax调用的示例,请参阅此关于createRecord的Ember API文档:http://emberjs.com/api/data/classes/DS.Adapter.html#method_createRecord

答案 1 :(得分:1)

感谢@ToddSmithSalter的建议,这使我找到了一个解决方案,结果对我的案例非常有效。我能够简单地在我的测试套件中加载的文件中重新打开我的适配器并重写ajax方法:

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

我已将ic.ajax.request导入为icRequest

这似乎工作正常,但我没有看到为每种类型的请求PUTGETPOSTDELETE单独注册灯具的方法,等

答案 2 :(得分:1)

感谢@ 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灯具,并在developmentproduction中保持不变。