Ember.js Ember应用程序套件如何在验收测试中覆盖应用程序适配器

Ember.js Ember应用程序套件如何在验收测试中覆盖应用程序适配器,ember.js,Ember.js,//问题:我想用Fixture adapter覆盖默认的application:adapter,它在我的实际应用程序中指向Rest//adapter。我尝试了app.register方法,但它不//使用任何指针。我找到了解决方法——不过,我会在底部包含一条免责声明 为了在应用程序已配置为使用另一个适配器时使用Fixture适配器,您需要重新定义应用程序适配器,以便它使用DS.FixtureAdapter类 我看到您正在使用EAK,因此我已将此代码包含在startApp函数中,就在创建应用程序的E

//问题:我想用Fixture adapter覆盖默认的application:adapter,它在我的实际应用程序中指向Rest//adapter。我尝试了app.register方法,但它不//使用任何指针。

我找到了解决方法——不过,我会在底部包含一条免责声明

为了在应用程序已配置为使用另一个适配器时使用Fixture适配器,您需要重新定义应用程序适配器,以便它使用
DS.FixtureAdapter

我看到您正在使用EAK,因此我已将此代码包含在startApp函数中,就在创建应用程序的
Ember.run
函数之前

define('myApp/adapters/application',['exports'],函数(exports){
导出['default']=DS.FixtureAdapter;
});
现在还需要为应用程序拥有的每个模型定义装置。您可能不想修改实际的源文件,因为这些文件仅用于验收测试,因此重新定义类也可以做到这一点

我创建了另一个名为setFixtures的助手:

功能设置装置(型号名称、装置){
var model=require('myApp/models/'+modelName)['default'];
模型类({
固定装置:固定装置
});
}
导出默认设置装置;
通过将其作为全局函数添加,并将以下内容添加到
test helper.js
中,从而使jshint感到高兴之后:

window.setFixtures=require('myApp/tests/helpers/set fixtures')['default'];
我现在已经准备好在我的每个模块中使用它进行测试:

模块('验收-我的设备'{
设置:函数(){
setFixtures('my-model'[
{id:1,名字:'John Madden'},
{id:2,名称:'AEIOUAEIOUAEIOU'}
]);
App=startApp();
}
});
//下面是您的测试
免责声明:我走了这条孤独的路,这是我所知道的唯一一条路,但似乎
DS.FixtureAdapter
仍然存在一些问题(在撰写本文时),而且它与
DS.RESTAdapter
有一些不同之处(更多信息)。然而,通过调整夹具在测试中的外观,可以克服大多数问题

最大的问题是关于FixtureAdapter的,它有很多关系,特别是与异步的关系。当然,他们会及时得到解决,但目前,这是相当脆弱的

我确实达到了这样一个地步,我不得不强制修改源代码,以便FixtureAdapter满意,或者为测试动态地重新定义所有模型类——在我看来,这就像为测试重写应用程序的一部分。这使我无法测试许多可能是实际错误的问题(例如,忘记了异步关系?验收测试不会警告您,因为您重新定义了类,使其不再需要它们)


我现在倾向于。然而,这是其他问题的材料。

@MayankGupta我知道很多时间已经过去了,但是如果这个答案解决了你的问题,别忘了将其标记为已接受的答案。=)
import Application from 'appkit/app';
import Router from 'appkit/router';

function startApp(attrs) {
  var App;

  var attributes = Ember.merge({
    // useful Test defaults
    rootElement: '#ember-testing',
    // LOG_ACTIVE_GENERATION:false,
    // LOG_VIEW_LOOKUPS: false
    LOG_ACTIVE_GENERATION: true,
    LOG_MODULE_RESOLVER: true,
    LOG_TRANSITIONS: true,
    LOG_TRANSITIONS_INTERNAL: true,
    LOG_VIEW_LOOKUPS: true  
  }, attrs); // but you can override;



  Ember.run.join(function(){
    App = Application.create(attributes);
    App.setupForTesting();
    App.injectTestHelpers();
  });

  Router.reopen({
    location: 'none'
  });
  App.reset(); // this shouldn't be needed, i want to be able to "start an app at a specific URL"

  return App;
}

export default startApp;