gpt4 book ai didi

angularjs - Angular 1.x/2 混合,业力测试不引导 ng1 应用程序

转载 作者:太空狗 更新时间:2023-10-29 17:01:33 24 4
gpt4 key购买 nike

我目前有一个使用 angular-cli 的混合 Angular 应用程序(2.4.9 和 1.5.0)。目前,在运行我们的应用程序时,我们能够正确引导 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 技能未能尝试找一个例子。

最佳答案

我希望我昨晚添加的赏金意味着我今天早上可以登录到为我准备的一个很好的解决方案。 las,它没有。因此,我花了一天时间浏览许多 SO 答案和 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
  • 中制作了它们的 DRY 列表
  • 我通过调用 downgradeForApp()main.ts 降级主应用程序的组件,如上所示(与 AOT 一起用于生产包),以及 main-jit.ts,上面没有显示(用于开发)
  • 我展示了我需要添加的导入,以便开始将 Angular 组件集成到我的 AngularJS 测试中。您可能需要更多/不同的,具体取决于例如关于您的测试是异步的,还是使用 Jasmine 而不是 Mocha。
  • 在每个需要使用降级组件的测试开始时,我使用 useAdaptedModule() 而不是 beforeEach(angular.mock.module("app")) “引导”事情;
  • 我从我的助手那里导入了一个替代的 it,它包装了 Mocha 提供的 it。我的测试都不是异步的;如果你有一些可能需要调整。我不知道它可能需要如何适应 Jasmine。

警告:实例化组件必须发生在 it 回调中,以便它发生在 upgradeAdapterRef.ready(...) 中。尝试在 beforeEach 内完成它太早了。

关于angularjs - Angular 1.x/2 混合,业力测试不引导 ng1 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42700652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com