2017-03-09 33 views
11

Şu anda açısal-kısımlı bir Hibrid Açısal uygulamasına (2.4.9 ve 1.5.0) sahibim. Bizim 1.5 uygulamasını bootstrap tam olarak nasıl emin değilimAçısal 1.x/2 Hibrit, karma testler önyükleme yapmıyor ng1 uygulaması

// test.ts 
// This file is required by karma.conf.js and loads recursively all the .spec and framework files 

import ...; 

declare var __karma__: any; 
declare var require: any; 

__karma__.loaded = function() {}; 

getTestBed().initTestEnvironment(
    BrowserDynamicTestingModule, 
    // I'm assuming that I need to call 'boostrapModule()' somehow here... 
    platformBrowserDynamicTesting() 
); 

const context = require.context('./', true, /\.spec\.ts$/); 

context.keys().map(context); 

__karma__.start(); 

: Bizim test.ts dosyada, Ancak

// main.ts 
import ... 

platformBrowserDynamic().bootstrapModule(AppModule).then(platformRef => { 
    angular.element(document).ready(() => { 
    const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule; 
    upgrade.bootstrap(document.body, ['myApp'], {strictDi: true}); 
    }); 
}); 

: Bizim uygulama çalıştırırken Şu anda, biz doğru 1.5 uygulamasını bootstrap edebiliyoruz Test ortamına girdiğim tek şey, Module 'myApp' is not available! oldu ve Google becerilerim bir örnek bulmaya çalışmadı.

+0

"Var __karma__: any; decle" ifadesini kaldırmak ve gerçek '@ types/karma 'paketini kullanmak iyi olabilir. Bu hataya neden olmaz, ancak her '' '' '' '' '' '' '' '' '' '' '' '; –

+0

"Angular 1.x/2 Hybrid" i okuduğumda, böyle bir şeyin bile mümkün olduğuna inanmak zorunda kaldım. – wheeler

cevap

5

Dün gece eklediğim ödülün, bu sabah giriş yapmam için güzel bir çözüm bulmamı umduğumu umuyordum. Ne yazık ki, yoktu. Bunun yerine, gün boyunca çalışmasını sağlayan birçok SO cevabı ve github sorunu etrafında gezdim. Üzgünüm, onlara kredi vermeme yardımcı olan her şeyi izlemedim, ama işte benim çözümüm. Muhtemelen ideal değil, ama şu ana kadar çalışıyor çünkü umarım iyi bir başlangıç ​​olur.

This github issuedowngradeComponent şimdilik işe yaramayacak olduğunu gösterir, bu yüzden ben UpgradeAdapter kullanarak eski bir tekniktir ne varsayalım gitti. Bu tekniğin initTestEnvironment kullanılmadığını unutmayın. İşte aşağıda bazı açıklamalar, ilgili snippet'leridir:

// downgrade.ts: 
export const componentsToDowngrade = { 
    heroDetail: HeroDetailComponent, 
    ... 
}; 
export function downgradeForApp() { 
    forOwn(componentsToDowngrade, (component, name) => { 
     app.directive(name!, downgradeComponent({ component })); 
    }); 
} 


// main.ts: 
downgradeForApp(); 
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory).then((platformRef) => { 
    ... 
}); 

// test.ts: 
require("../src/polyfills.ts"); 
require("zone.js/dist/proxy"); 
require('zone.js/dist/sync-test'); 
require("zone.js/dist/mocha-patch"); 

// test-helper.ts 
let upgradeAdapterRef: UpgradeAdapterRef; 
const upgradeAdapter = new UpgradeAdapter(AppModule); 
forEach(componentsToDowngrade, (component, selectorName) => { 
    angular.module("app").directive(
     selectorName!, 
     upgradeAdapter.downgradeNg2Component(component) as any, 
    ); 
}); 
export function useAdaptedModule() { 
    beforeEach(() => { 
     upgradeAdapterRef = upgradeAdapter.registerForNg1Tests(["app"]); 
    }); 
} 
export function it(expectation: string, callback:() => void) { 
    test(expectation, (done) => { 
     inject(() => { }); // triggers some kind of needed initialization 
     upgradeAdapterRef.ready(() => { 
      try { 
       callback(); 
       done(); 
      } catch (ex) { done(ex); } 
     }); 
    }); 
} 


// hero-detail.component.spec.ts 
import { it, useAdaptedModule } from "test-helpers/sd-app-helpers"; 
describe("",() => { 
    useAdaptedModule(); 
    it("behaves as expected",() => { ... }); 
}); 

A o koddan vurgulamaktadır birkaçı: Ben uygulama için daha testler için farklı bileşenleri bozmak

  • , bu yüzden bir KURU liste yaptım yukarıda gösterildiği gibi, downgradeForApp() arayarak main.ts ana uygulama için bileşenler bozmak downgrade.ts
  • bunların yukarıda gösterilmemiş olan, aynı zamanda main-jit.ts (üretim paketi için AOT kullanılır), ve (geliştirme için kullanılan)
  • AngularJS testlerine açısal bileşenleri entegre etmeye başlamak için eklemem gerekenleri gösterdim. Örneğe bağlı olarak daha/farklı olanlara ihtiyacınız olabilir. Testlerinizin asenkronize olup olmadığı ya da Mocha yerine Jasmine kullanıyorsunuz. döndürüldüğünü bileşenleri kullanmak gereken her testin başında
  • , ben Mocha tarafından sağlanan it sarar benim yardımcıları, alternatif bir it içe useAdaptedModule() yerine
  • beforeEach(angular.mock.module("app")); ait olan şeyleri "bootstrap". Testlerimden hiçbiri asenkron değildir; eğer biraz varsa, ince ayar gerektirebilir. Jasmine için nasıl uyarlanabileceğini bilmiyorum.

bir ihtar: o upgradeAdapterRef.ready(...) içinde olur, böylece bileşen it callback'inde içinde gerçekleşmesi gerekir Örnekleme. beforeEach içinde yapmaya çalışmak çok yakında.