将服务注入Ember测试

时间:2016-05-19 15:36:37

标签: unit-testing ember.js ember-testing

我已阅读并关注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'。我做错了什么?

2 个答案:

答案 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()
    });
    ...
});