我希望我昨晚添加的赏金意味着我今天早上可以登录到为我准备的一个很好的解决方案。唉,它没有。因此,我花了一天的时间在许多 SO 答案和 github 问题上游弋,让它发挥作用。很抱歉,我没有记录所有帮助我归功于他们的事情,但这是我的解决方案。这可能并不理想,但到目前为止它正在工作,所以我希望这是一个好的开始。
这个 github 问题表明这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
,上面未显示(用于开发)
- 我展示了我需要添加的导入,以便开始将 Angular 组件集成到我的 AngularJS 测试中。您可能需要更多/不同的测试,例如取决于您的测试是否是异步的,或者您使用 Jasmine 而不是 Mocha。
- 在每个需要使用降级组件的测试开始时,我用
useAdaptedModule()
而不是“引导”东西beforeEach(angular.mock.module("app"));
it
我从我的助手那里导入了一个替代方案,它包装了it
Mocha 提供的内容。我的测试都不是异步的;如果你有一些可能需要调整。我不知道它可能需要如何适应 Jasmine。
一个警告:实例化组件必须在it
回调中发生,以便它发生在upgradeAdapterRef.ready(...)
. 试图在 a 内做到这一点beforeEach
还为时过早。