2016-05-19 17 views
3

Ich habe gelesen und gefolgt EmberJS Service Injection for Unit Tests (Ember QUnit), aber ich bin immer noch nicht in der Lage, wo das Problem ist.Injektion von Service in Ember-Tests

Ich möchte testen, ob meine Authentifizierung wie erwartet funktioniert. Ich habe Authenticator für ember-simple-auth geschrieben und Session wird in Route injiziert. Der Code selbst funktioniert ohne Probleme.

Jetzt möchte ich einen Test erstellen, der testen wird, ob meine Authentifizierung wie erwartet funktioniert. Also möchte ich den AuthManager direkt verwenden.

moduleFor('route:index', 'Unit | Route | xyz', { 
    needs: ['service:session'] 
}); 

test('2', function(assert) { 
    let route = this.subject(); 
    let s = route.get('authManager'); 

Wenn ich den Inhalt von 's' drucken, bekomme ich ''. Wenn ich dies zu etwas anderem ändere, dann ist die Antwort wie erwartet nicht definiert. Problem ist, wenn ich die Eigenschaft 'isAuthenticated' erhalten oder 'invalidate()' ausführen möchte. In diesen Fällen wurde ich "undefiniert". Was mache ich falsch?

+0

Meine Vermutung ist, dass Sie Integrationstests verwenden müssen für solche Zwecke. Wenn Sie Komponententests schreiben möchten, müssen Sie alles außer dem getesteten Objekt selbst vortäuschen (in diesem Fall die Indexroute). Ich hatte ein ähnliches Problem Testing Services: http://StackOverflow.com/Questions/37190648/Injecting-Service-into-Amixin-Eember2-3 – Pavol

Antwort

1

In einem Komponententest verwenden wir lieber Mock-Objekte anstelle von Services. Bei Integrationstests können wir echte Dienste anstelle von Mocks verwenden.

Um einen Dienst in einem Unit-Test zu verspotten:

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

dieses Mock-Objekt zu injizieren, um Ihre Komponente/route Verwendung this.subject() Schöpfung, wie folgend:

test('2', function(assert){ 
    var component = this.subject({ 
     authManager: stubMyService.create() 
    }); 
    ... 
}); 
+0

Danke für die Antwort, sehr wahrscheinlich, ich war nicht klar genug. Ich möchte den injizierten Service testen. Die Kommunikation dieses Dienstes wird von ember-mirage gespottet, so dass es keine anderen Abhängigkeiten gibt. Das sind die Gründe, warum mir der Spottdienst nicht helfen wird. Ich weiß, dass ich eine Route erstellen und Akzeptanztests verwenden kann, ohne mich um solche Probleme zu kümmern, aber ich würde es gerne wissen. –

+0

Danke für die Antwort. Das hat bei mir auch bei einem Unit-Test für einen Service funktioniert (ein Service spritzt bei mir einen Service ein!) – morhook

+0

Dies funktioniert ab Ember 2.13 nicht mehr, siehe hierzu RFC: https://github.com/emberjs/rfcs /blob/master/text/0150-factory-for.md –

3

Ab Ember 2,13, die die richtige Lösung dafür ist zu verwenden this.register:

test('my test', function(assert) { 
    this.register('service:session', Ember.Service.extend({ 
    /* mock code */ 
    })); 

    let subject = this.subject(); 

    // test code goes here... 
}