我现在有一个混合的angular应用程序(2.4.9和1.5.0),使用angular cli。目前,在运行我们的应用程序时,我们能够正确引导1.5应用程序:
// 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});
});
});
但是,在我们的
test.ts
文件中:// 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();
我不确定如何将我们的1.5应用程序引导到测试环境中,我得到的只是
Module 'myApp' is not available!
,我的google技能也未能找到一个例子。 最佳答案
我希望我昨晚加的赏金能让我今天早上登录,找到一个好的解决方案。唉,没有。因此,我花了一天的时间在很多答案和github问题上游荡,让它开始工作。很抱歉,我没有记录所有帮助我归功于他们的事情,但这是我的解决方案。这可能不太理想,但到目前为止,我希望这是一个良好的开端。
This github issue表示downgradeComponent
暂时不起作用,所以我采用了一种我认为是使用UpgradeAdapter
的旧技术。请注意,此技术不使用initTestEnvironment
。以下是相关的片段,并给出了一些解释:
// 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", () => { ... });
});
这段代码的一些亮点:
我对测试组件的降级不同于对应用程序的降级,因此我在
downgrade.ts
中列出了它们的干列表。如上图所示,我通过调用
main.ts
将主应用程序的组件从downgradeForApp()
降级(与aot一起用于生产捆绑包),也从main-jit.ts
降级(用于开发)我展示了需要添加的导入,以便开始将角度组件集成到我的angularjs测试中。您可能需要更多/不同的测试,例如,取决于您的测试是异步的,还是使用茉莉花而不是摩卡。
在每个需要使用降级组件的测试开始时,我用
useAdaptedModule()
而不是beforeEach(angular.mock.module("app"));
引导一些东西。我从助手中导入了一个替代的
it
,它包装了mocha提供的it
。我的测试没有一个是异步的;如果你有一些,可能需要调整。我不知道该如何适应茉莉花。警告:实例化组件必须在
it
回调中进行,以便在upgradeAdapterRef.ready(...)
中进行。在beforeEach
内尝试这样做太早了。关于angularjs - Angular 1.x/2 Hybrid,业力测试无法引导ng1应用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42700652/