eff*_*fel 14 ember.js ember-qunit
在初始化程序中,我将一个对象注入我的帮助程序,它在应用程序中正常工作.
但是当使用QUnit测试帮助程序时,我收到以下错误:
TypeError:undefined不是函数.
帮助程序无法访问注入的对象,尽管在App.__container__.lookup('myObject:main')模块的setup函数内调用时,它确实返回了对象.
我怎样才能做到这一点?测试类基于fiddle1,fiddle2.
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
Run Code Online (Sandbox Code Playgroud)
您可以考虑使用服务来处理数据。然后可以将该服务注入到帮助程序中,然后可以很容易地对其进行单元测试。
Ember 2.x 中的助手现在是“真正的”对象并且可以访问服务。
该服务可能看起来像这样:
import Ember from 'ember';
export default Ember.Service.extend({
profile: {
name: 'mary',
},
});
Run Code Online (Sandbox Code Playgroud)
助手将通过注入从服务接收数据:
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();
},
});
Run Code Online (Sandbox Code Playgroud)
最后,单元测试将仅包括必需的 Person 服务need:
import { moduleFor, test } from 'ember-qunit';
moduleFor('helper:upper-case', {
needs: [ 'service:person' ], // <-- here
});
test('when the upperCase helper is used', function(assert) {
const helper = this.subject();
const result = helper.compute([ 'goodbye' ]);
const expected = 'GOODBYE MARY';
assert.equal(result, expected,
'...the dependency is injected and all are uppercased');
});
Run Code Online (Sandbox Code Playgroud)
此外,该服务还可以通过初始化程序注入到您的应用程序中,如下所示:
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,
};
Run Code Online (Sandbox Code Playgroud)
我创建了一个Ember Twiddle来演示。
| 归档时间: |
|
| 查看次数: |
1165 次 |
| 最近记录: |