2016-08-13 43 views
16

Angular için çok yeni ve hala bu kadarını anlamaya çalışıyorum. Yeoman Jeneratöründen oluşturduğum Açısal 1.5.8'i kullanarak bazı testler yazıyorum.TypeError: undefined bir kurucu değil

Özellikle, benim app.js ise

... (önemlidir olup olmadığını emin değilim) $ httpBackend sonuçlarını manipüle anlamaya çalışıyorum Aşağıdaki kod var file:

.run(['$rootScope', '$location', 'breadcrumbService', function ($rootScope, $location, breadcrumbService) { 
    $rootScope.$on('$viewContentLoaded', function() { 
     jQuery('html, body').animate({scrollTop: 0}, 200); 
    }); 

    $rootScope.isEditMode = false; 
    $rootScope.$on('$stateChangeSuccess', function() { 
     // ------------ this next line is failing ----------- 
     $rootScope.isEditMode = $location.path().toLowerCase().endsWith('/edit') || $location.path().toLowerCase().endsWith('/new'); 
    }); 

    $rootScope.parseJson = function (value) { 
     return angular.fromJson(value); 
    }; 

    $rootScope.bc = breadcrumbService; 

    $rootScope.title = ""; 
}]) 

Yaklaşık yarısında (yorumu eklediğim yerde) başarısız oluyor. Özellikle, endsWith fonksiyon bu hata ile, (tolower gayet) başarısız: İşte

PhantomJS 2.1.1 (Windows 8 0.0.0) Service: breadcrumbService should return breadcrumb label in json format FAILED 
     TypeError: undefined is not a constructor (evaluating '$location.path().toLowerCase().endsWith('/edit')') in app/scripts/app.js (line 44) 
     app/scripts/app.js:44:72 
     [email protected]_components/angular/angular.js:18005:33 
     bower_components/angular-ui-router/release/angular-ui-router.js:3353:32 
     [email protected]_components/angular/angular.js:16383:30 
     bower_components/angular/angular.js:16399:39 
     [email protected]_components/angular/angular.js:17682:28 
     [email protected]_components/angular/angular.js:17495:36 
     [email protected]_components/angular/angular.js:17790:31 
     [email protected]_components/angular/angular.js:11831:53 
     [email protected]_components/angular-mocks/angular-mocks.js:1368:17 
     [email protected]_components/angular-mocks/angular-mocks.js:1808:26 
     test/spec/services/breadcrumbservice.js:33:27 
     [email protected]_components/angular/angular.js:4718:24 
     [email protected]_components/angular-mocks/angular-mocks.js:3085:26 

benim test kodu (farklı örneklerden değiştirilmiş bazı önemsiz - sadece işe almaya çalışırken):

'use strict'; 

describe('Service: breadcrumbService', function() { 

    // load the service's module 
    beforeEach(module('myModule')); 

    var $httpBackend, $rootScope, createController, authRequestHandler; 
    beforeEach(inject(function($injector) { 

     $httpBackend = $injector.get('$httpBackend'); 
     console.log('Is null? '+ ($httpBackend == null)); 
     $httpBackend.whenGET(/views\/.*/).respond(200, [{}, {}, {}]); 

     authRequestHandler = $httpBackend.when('GET', '/api/v1/SiteStagings') 
      .respond({userId: 'userX'}, {'A-Token': 'xxx'}); 

     // Get hold of a scope (i.e. the root scope) 
     $rootScope = $injector.get('$rootScope'); 
     $httpBackend.flush(); 
    })); 

    // instantiate service 
    var breadcrumbService; 
    beforeEach(inject(function (_breadcrumbService_) { 
     breadcrumbService = _breadcrumbService_; 
    })); 

    it('svc should exist', function() { 
     expect(!!breadcrumbService).toBe(true); 
    }); 

    it('should return breadcrumb label in json format', function() { 
     var result = breadcrumbService.getFromCache('site', 'SiteGroupStagings', 46, 'SiteGroupDesc'); 
     console.log(result); 
     expect(!!result).toBe(true); 

    }); 
}); 

Burada yanlış bir şey yaptığımdan şüphe etmiyorum, ne olduğunu tam olarak anlayamıyorum. Bu hata gerçekten ne anlama geliyor ve neden endsWith numaralı telefon görüşmemden hoşlanmıyor?

Teşekkür

Sorumun cevabını ya da sadece bir düzenleme olarak yayınla, ama sanırım edilip edilmeyeceğini tartışılan

cevap

30

"undefined bir kurucu değil", tanımlı olmayan bir işlevi çağırmayı denediğinizde PhantomJS hata mesajını görüntülüyor. PhantomJS'inizin desteklediği ECMAScript'in sürümüne bağlıdır. Bu, Chrome'da iyi çalıştığını söylediğiniz gibi, bu tarayıcı testte kullandığınız işlevi desteklediğinden. Sorununuzu gidermek ve hala PhantomJS'i kullanabilmek için "bilinmeyen PhantomJS" işlevini kendi başınıza değiştirebilirsiniz. Benim Durumunda

8

o (şimdilik) cevabım bu:

Sorun ilişkilidir görünüyor PhantomJS. Motoru, mixed.conf.js dosyasında Chrome olarak değiştirdiğimde, bu testler geçti.

Hala bu hata iletisinin ne anlama geldiğini ve neden PhantomJS ile çalışmadığını bilmiyorum, ancak en azından şimdi devam edemiyorum.

İşte (durumda herkes meraklı) benim karma.conf.js değişiklikler şunlardır:

browsers: [ 
//'PhantomJS', 
'Chrome' 
], 

// Which plugins to enable 
plugins: [ 
'karma-chrome-launcher', 
//'karma-phantomjs-launcher', 
'karma-jasmine' 
], 

Btw - Ben endsWith ECMAScript6 yeni olduğunu fark etmedi (ben yaşlıydı düşünüyordum), ancak WebStorm, açısal-ui-grid'de bir yardımcı fonksiyona referans gösterdiğinin göstergesidir. Ui-grid bağımlılığının çok geç yüklenip yüklenmediğini görmek için karma.conf.js dosyasında files dizisi ile uğraşırken epey bir süre harcadım. Her testte, Chrome'da iyi çalıştı, ancak PhantomJS'de değil. Hala neden olduğu hakkında hiçbir fikrim yok.

+0

Ben PhantomJS ile benzer sorunlar yaşıyorum. Çoğu zaman tüm sınamalar geçer, ancak diğer zamanlar hepsi aynı hatayla başarısız olurlar "TypeError: undefined bir kurucu değil (değerlendirme ...) .Windows'da PhantomJS ile olur. Chrome'u kullanarak hatalar asla oluşmaz. –

4

: Neden Olan Döngüsel Bağımlılıklar: Benim javascript üretim kodu (ana baba günü/webpack ile derlenmiş ES6 sözdizimi) içinde ithalatı ekledikten sonra

PhantomJS 2.1.1 (Windows 8 0.0.0) ERROR TypeError: undefined is not a constructor (evaluating '(0, _actions.prefix)('SET_USER_INPUT_PHONE_NUMBER')') at undefined:12

aynı hata var. Değişiklikler, uygulamanın bir üretim yapısı kromda yüklendiğinde, ancak phantomJS ile yapılan testlerin çalışmasında hata oluştu. Benim durumumda, eklenen ithalatlar döngüsel bağımlılıklar yarattı. Ben ileride başvurmak üzere buraya bu bırakacağım

(Ben birkaç hafta önce aynı sorunu tökezledi ve birkaç hafta sonra tekrar başımı kaşımaya istemiyorum) ve aynı hatayı google diğerleri için.

+0

m ünitesi testi çalıştıran ve iş yerinde dairesel modülü bağımlılık yanı var şüphe olduğunda da bu hatayı alıyorum. yazı için teşekkürler. –

+0

Sen açıktır. Ben de başkalarına yardım biridir memnun değil, sadece bana benim. – Martin

2

Ben includes() yöntemi kullanarak TypeError: undefined is not a constructor hatayı alıyordum. includes() ve endsWith() yöntemleri, ECMAScript 2015'te yenidir ve Internet Explorer'da desteklenmez ve açıkça PhantomJS tarafından desteklenmez. Son kullanıcılar Internet Explorer kullanıyor olabilir bir şans var

. Bu durumda, bunun yerine Örneğin includes() veya endsWith()

tamamen desteklenen indexOf() yöntemi kullanmak isteyebilirsiniz, benim durumumda, her şey krom büyük çalıştı, ama benim testleri hattında başarısız edildi:

if (item.name.includes('contents'))

yerine indexOf() yöntemini kullanarak şu şekilde değiştirildi:

if (item.name.indexOf('contents') !== -1)

sonra artık başlamıştı TypeError: undefined is not a constructor hata

İlgili konular