Ember.js: Uncaught TypeError: невозможно прочитать свойство hasRoute из undefined

Созданный на 11 авг. 2015  ·  4Комментарии  ·  Источник: emberjs/ember.js

У меня есть служба аутентификации, для которой я пытаюсь написать модульный тест.

Если в службе Auth нет предыдущего перехода, он перенаправляется на определенный маршрут.

Приложение работает должным образом, однако тесты для этой службы выдают следующую ошибку:

Uncaught TypeError: Cannot read property 'hasRoute' of undefined

Я не знаю, как отладить / решить эту проблему. В чем дело?

Вот моя служба авторизации:

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

И мой роутер:

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;

Вот тест для этой службы:

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

});

Использование Ember 2.0.0-beta.5

Самый полезный комментарий

Вы используете частную службу -routing , она ожидает инициализации и настройки экземпляра router . В этом тесте этого не происходит, поэтому вам нужно либо смоделировать его, либо настроить маршрутизатор.

Я не против немного подправить https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37, чтобы предотвратить эту ошибку (в конечном итоге она должна вернуться false, если get(this, 'router') ложно), если вы хотите отправить PR, но использование частного API неподдерживаемым способом не является ошибкой.

Все 4 Комментарий

Вы используете частную службу -routing , она ожидает инициализации и настройки экземпляра router . В этом тесте этого не происходит, поэтому вам нужно либо смоделировать его, либо настроить маршрутизатор.

Я не против немного подправить https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37, чтобы предотвратить эту ошибку (в конечном итоге она должна вернуться false, если get(this, 'router') ложно), если вы хотите отправить PR, но использование частного API неподдерживаемым способом не является ошибкой.

Закрытие этого вопроса, но я с радостью рассмотрю PR.

Поздно для игры, но я просто хочу показать, как я решил такие проблемы.

Просто переопределите методы.

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

Я делаю это, потому что сам написал тесты для тестирования различных маршрутов, а также доверяю команде ember тестировать ember/service/routing.js

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

Один из способов заглушить его, не провалив тестовый пример

Была ли эта страница полезной?
0 / 5 - 0 рейтинги