Unit testing 向余烬试验中注入服务

Unit testing 向余烬试验中注入服务,unit-testing,ember.js,ember-testing,Unit Testing,Ember.js,Ember Testing,我已经阅读并遵循了,但我仍然无法找出问题所在 我想测试我的身份验证是否按预期工作。我已经为ember simple auth编写了验证器,会话被注入到路由中。代码本身工作没有任何问题 export default Ember.Route.extend({ authManager: Ember.inject.service('session'), ... (in actions): this.get('authManager').invalidate() 现在,我想创建一个测

我已经阅读并遵循了,但我仍然无法找出问题所在

我想测试我的身份验证是否按预期工作。我已经为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()”时。在这些情况下,我得到了“未定义”。我做错了什么?

在单元测试中,我们更喜欢使用模拟对象而不是服务。在集成测试中,我们可以使用真实的服务而不是模拟

要模拟服务,请在单元测试中执行以下操作:

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

从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...
}

我的猜测是,您需要使用集成测试来实现这些目的。如果您想编写单元测试,您需要模拟除测试对象本身(在本例中是索引路由)之外的所有内容。我在测试服务时遇到了类似的问题:感谢您的回复,很可能我不够清楚。我想测试注入的服务。该服务的通信被ember mirage模仿,因此没有其他依赖项。这就是为什么模拟服务对我没有帮助的原因。我知道我可以创建一个路由并使用验收测试,而不必担心这些问题,但我想知道。感谢您的回复。这对我来说也适用于服务的单元测试(在我的例子中,服务注入了服务!)这在Ember 2.13中不再起作用,请参见以下RFC: