Ember.js:对具有依赖项注入的助手进行单元测试?
在初始化器中,我将一个对象注入到我的助手中,它在应用程序中正常工作 但在使用QUnit测试助手时,我得到以下错误: TypeError:undefined不是函数 助手没有访问注入对象的权限,尽管在模块的setup函数中调用Ember.js:对具有依赖项注入的助手进行单元测试?,ember.js,ember-qunit,Ember.js,Ember Qunit,在初始化器中,我将一个对象注入到我的助手中,它在应用程序中正常工作 但在使用QUnit测试助手时,我得到以下错误: TypeError:undefined不是函数 助手没有访问注入对象的权限,尽管在模块的setup函数中调用App.\uuuu container\uuuu.lookup('myObject:main')时,它会返回对象 我怎样才能做到这一点?测试类基于 CoffeeScript中的以下示例显示了我的问题: App = undefined entered = false initi
App.\uuuu container\uuuu.lookup('myObject:main')
时,它会返回对象
我怎样才能做到这一点?测试类基于
CoffeeScript中的以下示例显示了我的问题:
App = undefined
entered = false
initializedCount = 0
module 'testing',
setup: ->
App = startApp()
teardown: ->
Ember.run(App, 'destroy')
Ember.Application.initializer({
name: "person",
initialize: (container, application) ->
initializedCount++;
person = {
name: "Mary"
}
container.register('person:main', person, {instantiate: false});
container.injection('helper', 'person', 'person:main');
});
createView = (template, context) ->
context = {} unless context
View = Ember.View.extend(
controller: context
template: Ember.Handlebars.compile(template)
)
View.create()
append = (view) ->
Ember.run ->
view.appendTo "#ember-testing"
return
return
Ember.Handlebars.helper "upcase", (value) ->
person = @get('person'); # <-- test fails here
value += person.name;
value.toUpperCase()
Ember.testing = true
test('non-redirect route /third', ->
equal(initializedCount, 2, 'initializer ran');
App.reset();
equal(initializedCount, 3, 'initializer ran');
App.reset();
equal(initializedCount, 4, 'initializer ran');
);
test "a handlebars helper", ->
view = createView("{{upcase 'something'}}")
append view
equal view.$().text(), "SOMETHING MARY"
return
App=未定义
输入=假
initializedCount=0
模块“测试”,
设置:->
App=startApp()
拆卸:->
运行(应用程序“销毁”)
Ember.Application.initializer({
姓名:“人”,
初始化:(容器、应用程序)->
初始化计数++;
人={
姓名:“玛丽”
}
register('person:main',person,{instantiate:false});
容器。注射('helper','person','person:main');
});
createView=(模板,上下文)->
上下文={}除非上下文
视图=Ember.View.extend(
控制器:上下文
模板:Ember.handlebar.compile(模板)
)
View.create()
追加=(视图)->
Ember.run->
view.appendTo“#余烬测试”
返回
返回
Ember.handlebar.helper“upcase”(值)->
person=@get('person');#
相等(initializedCount,2,‘InitializedRan’);
App.reset();
相等(initializedCount,3,'初始值设定项运行');
App.reset();
相等(initializedCount,4,‘InitializedRan’);
);
测试“车把助手”,->
view=createView(“{{upcase'something'}}”)
附加视图
相等视图。$().text(),“玛丽”
返回
可以考虑使用服务来处理数据。然后可以将服务注入helper,这样就可以很容易地进行单元测试
该服务可能如下所示:
import Ember from 'ember';
export default Ember.Service.extend({
profile: {
name: 'mary',
},
});
export function initialize(application) {
application.inject('controller', 'person', 'service:person');
application.inject('component', 'person', 'service:person');
application.inject('route', 'person', 'service:person');
// etc.
}
export default {
name: 'person',
initialize,
};
助手将通过注入从服务接收数据:
import Ember from 'ember';
export default Ember.Helper.extend({
person: Ember.inject.service(), // <-- here
compute(params) {
const text = params[0];
const name = this.get('person.profile.name');
const phrase = `${text} ${name}`;
return this.upperCase(phrase);
},
upperCase(str) {
return str.toUpperCase();
},
});
此外,还可以通过初始值设定项在应用程序中注入服务,如下所示:
import Ember from 'ember';
export default Ember.Service.extend({
profile: {
name: 'mary',
},
});
export function initialize(application) {
application.inject('controller', 'person', 'service:person');
application.inject('component', 'person', 'service:person');
application.inject('route', 'person', 'service:person');
// etc.
}
export default {
name: 'person',
initialize,
};
我创建了一个来演示。在最近的余烬中,moduleFor()
语法,但是作为控制器和其他实例的迁移路径的this.owner.lookup()
方法似乎并没有返回具有帮助程序上下文的实例
我找不到任何关于测试具有依赖性的帮助程序的文档,但之后,我发现这似乎起到了作用:
import { module, test } from 'qunit'
import { setupTest } from 'ember-qunit'
module('Unit | Helper | example-helper', function (hooks) {
setupTest(hooks)
let exampleHelper
hooks.beforeEach(function () {
exampleHelper = this.owner.factoryFor('helper:example-helper').create()
})
test('base', function (assert) {
assert.equal(exampleHelper.compute([params]), 'expected result')
})
})
使用factoryFor().create()
确实构造了一个具有适当上下文和注入依赖项的实例。我不知道这是否是推荐的方法,但它似乎做到了我想要的 你有没有找到解决办法?我有一个类似的问题。你使用哪个版本的余烬?