具有瞬态依赖性的Aurelia测试组件从不使用模拟

我们正在使用此处定义的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

clOUdland619 回答:具有瞬态依赖性的Aurelia测试组件从不使用模拟

与Rob Eisenberg讨论此问题之后,有一个解决此问题的方法。首先,删除类上的@transient装饰器,然后在您的应用程序启动时(通常是main.ts)在该类中将其注册为临时类。

在此处查看线​​程: https://github.com/Magrangs/dependency-injection/commit/56c7d96a496e76f330a1fc3f9c4d62700b9ed596

我还更新了上面发布的存储库:https://github.com/Magrangs/aurelia-transient-dependency-issue

包括此修复程序。

希望这将帮助其他面临相同问题的开发人员。

本文链接:https://www.f2er.com/2691347.html

大家都在问