我们正在使用此处定义的aurelia组件测试(带有笑话):https://aurelia.io/docs/testing/components#testing-a-custom-element
我们正在测试的组件具有瞬态依赖性。我们正在为此依赖关系创建一个模拟,但是当我们使用auestest运行测试时,真正的模拟总是被DI容器注入,而从未被模拟注入。
这是临时服务:
import { transient } from "aurelia-framework";
@transient()
export class ItemService {
constructor() {
}
getItems(): void {
console.log('real item service');
}
}
这里是“模拟”服务(我们也尝试使用开玩笑的模拟,但得到的结果相同):
import { transient } from "aurelia-dependency-injection";
@transient()
export class MockItemService{
getItems():void {
console.log('mock item service');
}
}
这里是被测组件:
import {ItemService} from "../services/item-service";
import { autoinject } from "aurelia-dependency-injection";
@autoinject()
export class TestElement {
constructor(private _itemService: ItemService) {
}
attached(): void {
this._itemService.getItems();
}
}
这是规格文件:
import {TestElement} from "../../src/resources/elements/test-element";
import {ComponentTester,StageComponent} from "aurelia-testing";
import {ItemService} from "../../src/resources/services/item-service";
import {MockItemService} from "./mock-item-service";
import {bootstrap} from "aurelia-bootstrapper";
describe('test element',() => {
let testElement;
const path: string = '../../src/resources/elements/test-element';
beforeEach(() => {
testElement = StageComponent.withResources(path).inView(`<test-element></test-element>`);
testElement.bootstrap(aurelia => {
aurelia.use.standardConfiguration();
aurelia.container.registerTransient(ItemService,MockItemService);
});
});
afterEach(() => {
testElement.dispose();
});
it('should call mock item service',async() => {
await testElement.create(bootstrap);
expect(testElement).toBeTruthy();
})
});
但是每次运行测试时,控制台都会注销真实服务而不是模拟服务。我已将其追溯到 Container.prototype.get 函数中的 aurelia-dependency-injection.js 。问题似乎与这段代码有关:
var registration = aureliaMetadata.metadata.get(aureliaMetadata.metadata.registration,key);
if (registration === undefined) {
return this.parent._get(key);
}
注册对象似乎有点奇怪,如果未定义,则代码将正常工作,因为正确的依赖项已在父项上注册,并且将获得模拟依赖项。但是,它不是未定义的,因此它在此行的DI容器中注册了实际服务:
return registration.registerResolver(this,key,key).get(this,key);
注册对象如下:
registration = TransientRegistration {_key = undefined}
这是aurelia中的错误,还是我的工作有问题?
非常感谢
p.s。 GitHub仓库在此处复制问题:https://github.com/Magrangs/aurelia-transient-dependency-issue
p.p.s分叉了DI容器仓库,并添加了一个快速修复程序,该修复程序可以解决我的特定问题,但不确定会带来什么样的影响。如果aurelia小组的成员可以检查,那就很好了:
https://github.com/Magrangs/dependency-injection/commit/56c7d96a496e76f330a1fc3f9c4d62700b9ed596