3

我已经阅读并关注了用于单元测试的 EmberJS 服务注入(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'的内容时,我得到''。如果我将其更改为其他内容,则响应未定义,正如预期的那样。问题是当我想获取属性“isAuthenticated”或运行“invalidate()”时。在这些情况下,我得到了“未定义”。我究竟做错了什么?

4

2 回答 2

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...
}
于 2017-05-12T08:47:30.750 回答
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()
    });
    ...
});
于 2016-05-20T06:42:59.680 回答