Ich habe einen Authentifizierungsdienst, für den ich einen Komponententest schreiben möchte.
Wenn im Auth-Dienst kein vorheriger Übergang gespeichert ist, wird auf eine bestimmte Route umgeleitet.
Die App funktioniert wie erwartet, die Tests für diesen Dienst geben jedoch den folgenden Fehler aus:
Uncaught TypeError: Cannot read property 'hasRoute' of undefined
Ich weiß nicht, wie man das debuggt / löst. Was ist los?
Hier ist mein Authentifizierungsdienst:
import Ember from 'ember';
import config from '../config/environment';
export default Ember.Service.extend({
routing: Ember.inject.service('-routing'),
loginCapable: true,
localStorageKey: config.localStorageKeys.user,
checkAuth(priorTransition){
this.set('priorTransition', priorTransition);
return this.get('isLoggedIn');
},
isLoggedIn: Ember.computed('user', function(){
return !!this.get('user');
}),
init(){
this.set('user', JSON.parse(window.localStorage.getItem( this.get("localStorageKey") )) );
},
login(adID){
return Ember.$.ajax(
config.apiHost + config.apiVersion + "/getLdapInfo",{
type: 'GET',
data: "adID="+adID
}).then(json => {
this.set('user', json);
window.localStorage.setItem( this.get("localStorageKey") , JSON.stringify(json));
var priorTransition = this.get('priorTransition');
if( priorTransition )
{
priorTransition.retry();
this.set('priorTransition', null);
}else{
this.get('routing').transitionTo('index');
}
}, xhr => {
return xhr.responseJSON ? xhr.responseJSON.message : "Login failed";
});
}
});
Und mein Router:
import Ember from 'ember';
import config from './config/environment';
var Router = Ember.Router.extend({
location: config.locationType
});
Router.map(function() {
this.route('authenticated', { path: '/' }, function(){
this.route('index', { resetNamespace: true });
});
this.route('login');
});
export default Router;
Hier ist der Test für diesen Dienst:
import { moduleFor, test } from 'ember-qunit';
import Ember from 'ember';
import startApp from 'recruiter-admin/tests/helpers/start-app';
import Pretender from 'pretender';
var server,
application;
var user = [{
"adID":"uniqueID",
"first_name":"First Name",
"last_name":"Last Name",
"employee_type":"Regular",
"employee_id":"12345",
"manager":"CN=managerID,OU=Employees,OU=company Users,DC=company,DC=com",
"success":true
}];
function jsonResponse(json, status = 200) {
return [status, {"Content-Type": "application/json"}, JSON.stringify(json)];
}
moduleFor('service:auth', 'Unit | Service | auth', {
unit:true,
needs:['router:main'],
beforeEach(){
application = startApp();
server = new Pretender(function(){
this.get('/getLdapInfo', function(req){
return jsonResponse(user.findBy('adID',req.queryParams.adID));
});
});
},
afterEach(){
Ember.run(application, 'destroy');
if( server ){
server.shutdown();
}
}
});
// Replace this with your real tests.
test('it exists', function(assert) {
var service = this.subject();
assert.ok(service);
});
test('isLoggedIn Testing', function(assert){
var service = this.subject();
assert.ok(service.get('isLoggedIn') === false, 'Not logged in');
Ember.run(()=>{
service.set('user', true);
});
assert.ok(service.get('isLoggedIn') === true, 'IS logged in');
});
test('can login', function(assert){
assert.expect(0);
var service = this.subject();
Ember.run(()=>{
service.login('uniqueID');
});
andThen(()=>{
assert.ok(service.get('user'));
});
});
Verwenden von Ember 2.0.0-beta.5
Sie verwenden den privaten -routing
Dienst, er erwartet, dass eine router
Instanz initialisiert und eingerichtet wird. Dieser Test tut dies nicht, also müssen Sie ihn entweder verspotten oder den Router einrichten.
Ich bin nicht dagegen, https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 ein wenig zu optimieren, um diesen Fehler zu verhindern (es sollte letztendlich zurückkehren false, wenn get(this, 'router')
falsey ist), wenn Sie eine PR einreichen möchten, aber die Verwendung privater APIs auf nicht unterstützte Weise kein Fehler ist.
Ich schließe dieses Problem, aber ich würde gerne eine PR überprüfen.
Zu spät für das Spiel, aber ich möchte nur zeigen, wie ich solche Probleme gelöst habe.
Überschreiben Sie einfach die Methoden.
const service = this.subject({
routing: {
transitionTo() {
return true;
}
}
})
Ich mache das, weil ich Tests zum Testen verschiedener Routen selbst geschrieben habe, vertraue auch auf das ember-Team, um ember/service/routing.js
zu testen
this.owner.unregister('service:router');
this.owner.register('service:router', mocks.routerService());
Eine Möglichkeit, es zu betäuben, ohne den Testfall zu bestehen
Hilfreichster Kommentar
Sie verwenden den privaten
-routing
Dienst, er erwartet, dass einerouter
Instanz initialisiert und eingerichtet wird. Dieser Test tut dies nicht, also müssen Sie ihn entweder verspotten oder den Router einrichten.Ich bin nicht dagegen, https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 ein wenig zu optimieren, um diesen Fehler zu verhindern (es sollte letztendlich zurückkehren false, wenn
get(this, 'router')
falsey ist), wenn Sie eine PR einreichen möchten, aber die Verwendung privater APIs auf nicht unterstützte Weise kein Fehler ist.