我已阅读并关注EmberJS Service Injection for Unit Tests (Ember QUnit),但我仍然无法确定问题所在。
我想测试我的身份验证是否按预期工作。我已经为ember-simple-auth编写了验证器,并且会话被注入到路由中。代码本身没有任何问题。
export default Ember.Route.extend({
authManager: Ember.inject.service('session'),
...
(in actions):
this.get('authManager').invalidate()
现在,我想创建一个测试,测试我的身份验证是否正常工作。所以我希望直接使用authManager。
moduleFor('route:index', 'Unit | Route | xyz', {
needs: ['service:session']
});
test('2', function(assert) {
let route = this.subject();
let s = route.get('authManager');
当我打印出“' s”的内容时,我得到了''。如果我将其更改为其他内容,则可以预期响应未定义。问题是当我想要获得财产时,他们是经过验证的。或者运行' invalidate()'。在这些情况下,我得到了#undefined'。我做错了什么?
答案 0 :(得分:4)
从Ember 2.13开始,正确的解决方法是使用this.register
:
test('my test', function(assert) {
this.register('service:session', Ember.Service.extend({
/* mock code */
}));
let subject = this.subject();
// test code goes here...
}
答案 1 :(得分:1)
在单元测试中,我们更喜欢使用模拟对象而不是服务。在集成测试中,我们可能使用真实服务而不是模拟。
在单元测试中模拟服务:
var stubMyService = Ember.Object.extend({
//This is a mock object, write a code to test component/route!
invalidate: function() {
return 'invalidateCalled';
},
isAuthenticated: function(){
return true;
}
});
要将此模拟对象注入组件/路由,请使用this.subject()
创建如下:
test('2', function(assert){
var component = this.subject({
authManager: stubMyService.create()
});
...
});