Ember.js: Error de tipo no detectado: no se puede leer la propiedad 'hasRoute' de undefined

Creado en 11 ago. 2015  ·  4Comentarios  ·  Fuente: emberjs/ember.js

Tengo un servicio de autenticación para el que estoy intentando escribir una prueba unitaria.

Cuando no hay una transición anterior almacenada en el servicio de autenticación, se redirige a una ruta específica.

La aplicación funciona como se esperaba, sin embargo, las pruebas para este servicio dan el siguiente error:

Uncaught TypeError: Cannot read property 'hasRoute' of undefined

No sé cómo depurar / resolver esto. ¿Qué pasa?

Aquí está mi servicio de autenticación:

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

Y mi enrutador:

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;

Aquí está la prueba para ese servicio:

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

});

Usando Ember 2.0.0-beta.5

Comentario más útil

Está utilizando el servicio privado -routing , espera tener una instancia router inicializada y configurada. Esta prueba no hace eso, por lo que debe simularla o configurar el enrutador.

No me opongo a modificar https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 un poco para evitar este error (en última instancia, debería volver falso si get(this, 'router') es falso) si desea enviar un PR, pero el uso de API privadas de una manera no admitida no es un error.

Todos 4 comentarios

Está utilizando el servicio privado -routing , espera tener una instancia router inicializada y configurada. Esta prueba no hace eso, por lo que debe simularla o configurar el enrutador.

No me opongo a modificar https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 un poco para evitar este error (en última instancia, debería volver falso si get(this, 'router') es falso) si desea enviar un PR, pero el uso de API privadas de una manera no admitida no es un error.

Cerrando este problema, pero felizmente revisaría un PR.

Tarde para el juego, pero solo quiero mostrar la forma en que lo hice para resolver esos problemas.

Simplemente anule los métodos.

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

Estoy haciendo esto porque escribí pruebas para probar diferentes rutas, también confío en el equipo de Ember para probar ember/service/routing.js

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

Una forma de eliminarlo sin fallar en el caso de prueba

¿Fue útil esta página
0 / 5 - 0 calificaciones