Ember.js: TypeError Tidak Tertangkap: Tidak dapat membaca properti 'hasRoute' dari undefined

Dibuat pada 11 Agu 2015  ·  4Komentar  ·  Sumber: emberjs/ember.js

Saya memiliki layanan auth yang saya coba tulis untuk unit test.

Saat tidak ada transisi sebelumnya yang disimpan di layanan Auth, transisi akan dialihkan ke rute tertentu.

Aplikasi berfungsi seperti yang diharapkan, namun pengujian untuk layanan ini memberikan kesalahan berikut:

Uncaught TypeError: Cannot read property 'hasRoute' of undefined

Saya tidak tahu cara men-debug/menyelesaikan ini. Apa yang sedang terjadi?

Inilah layanan autentikasi saya:

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

Dan router saya:

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;

Inilah tes untuk layanan itu:

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

});

Menggunakan Ember 2.0.0-beta.5

Komentar yang paling membantu

Anda menggunakan layanan pribadi -routing , mengharapkan instance router diinisialisasi dan disiapkan. Tes ini tidak melakukan itu, jadi Anda harus mengejeknya atau mengatur router.

Saya tidak menentang mengutak-atik https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 sedikit untuk mencegah kesalahan ini (pada akhirnya harus kembali false jika get(this, 'router') salah) jika Anda ingin mengirimkan PR, tetapi menggunakan API pribadi dengan cara yang tidak didukung bukanlah bug.

Semua 4 komentar

Anda menggunakan layanan pribadi -routing , mengharapkan instance router diinisialisasi dan disiapkan. Tes ini tidak melakukan itu, jadi Anda harus mengejeknya atau mengatur router.

Saya tidak menentang mengutak-atik https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 sedikit untuk mencegah kesalahan ini (pada akhirnya harus kembali false jika get(this, 'router') salah) jika Anda ingin mengirimkan PR, tetapi menggunakan API pribadi dengan cara yang tidak didukung bukanlah bug.

Menutup masalah ini, tetapi saya akan dengan senang hati meninjau PR.

Terlambat untuk permainan, tetapi saya hanya ingin menunjukkan cara yang saya lakukan untuk menyelesaikan masalah seperti itu.

Ganti saja metodenya.

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

Saya melakukan ini karena saya telah menulis tes untuk menguji rute yang berbeda itu sendiri, juga percaya pada tim ember untuk menguji ember/service/routing.js

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

Salah satu cara mematikannya tanpa gagal dalam ujian

Apakah halaman ini membantu?
0 / 5 - 0 peringkat