Ember.js: Uncaught TypeError : impossible de lire la propriété 'hasRoute' d'undefined

Créé le 11 août 2015  ·  4Commentaires  ·  Source: emberjs/ember.js

J'ai un service d'authentification pour lequel j'essaie d'écrire un test unitaire.

Lorsqu'il n'y a pas de transition précédente stockée dans le service Auth, il redirige vers une route spécifique.

L'application fonctionne comme prévu, mais les tests pour ce service donnent l'erreur suivante :

Uncaught TypeError: Cannot read property 'hasRoute' of undefined

Je ne sais pas comment déboguer/résoudre cela. Ce qui se passe?

Voici mon service d'authentification :

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

Et mon routeur :

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;

Voici le test pour ce service :

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

});

Utiliser Ember 2.0.0-beta.5

Commentaire le plus utile

Vous utilisez le service privé -routing , il s'attend à ce qu'une instance router initialisée et configurée. Ce test ne fait pas cela, vous devez donc vous en moquer ou configurer le routeur.

Je ne suis pas opposé à modifier un peu https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 pour éviter cette erreur (il devrait finalement revenir false si get(this, 'router') est false) si vous souhaitez soumettre un PR, mais que l'utilisation d'API privées d'une manière non prise en charge n'est pas un bogue.

Tous les 4 commentaires

Vous utilisez le service privé -routing , il s'attend à ce qu'une instance router initialisée et configurée. Ce test ne fait pas cela, vous devez donc vous en moquer ou configurer le routeur.

Je ne suis pas opposé à modifier un peu https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 pour éviter cette erreur (il devrait finalement revenir false si get(this, 'router') est false) si vous souhaitez soumettre un PR, mais que l'utilisation d'API privées d'une manière non prise en charge n'est pas un bogue.

Clôturer ce problème, mais je serais ravi d'examiner un PR.

En retard pour le jeu, mais je veux juste montrer comment j'ai fait pour résoudre de tels problèmes.

Remplacez simplement les méthodes.

const service = this.subject({
    routing: {
      transitionTo() {
        return true;
      }
    }
})

Je fais cela parce que j'ai écrit des tests pour tester différents itinéraires lui-même, faites également confiance à l'équipe de braises pour tester ember/service/routing.js

this.owner.unregister('service:router');
this.owner.register('service:router', mocks.routerService());

Une façon de le remplacer sans échouer au cas de test

Cette page vous a été utile?
0 / 5 - 0 notes