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