Ember.js: Uncaught TypeError: Die Eigenschaft 'hasRoute' von undefined kann nicht gelesen werden

Erstellt am 11. Aug. 2015  ·  4Kommentare  ·  Quelle: emberjs/ember.js

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

Hilfreichster Kommentar

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.

Alle 4 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen