Мы используем тестирование компонента aurelia, как определено здесь (с помощью jest): https://aurelia.io/docs/testing/components#testing -a-custom-element
Компонент, который мы тестируем, имеет временную зависимость. Мы создаем макет для этой зависимости, но когда мы запускаем тесты с использованием au jest, реальный всегда вводится контейнером DI, а не макетом .
Вот служба Transient :
import { transient } from "aurelia-framework";
@transient()
export class ItemService {
constructor() {
}
getItems(): void {
console.log('real item service');
}
}
Вот сервис 'Mock' (мы также пытались использовать шутки, но получаем тот же результат):
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();
}
}
Вот файл spe c:
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();
})
});
Но при каждом запуске теста консоль выходит из системы реального сервиса, а не макета. Я проследил это до aurelia-зависимости-инъекции. js в функции Container.prototype.get . Кажется, проблема заключается в следующем разделе кода:
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}
Это ошибка в аурелия или что-то не так с тем, что я делаю?
Большое спасибо
ps Репозиторий GitHub здесь, чтобы повторить проблему: https://github.com/Magrangs/aurelia-transient-dependency-issue
pps Форкнул репозиторий контейнера DI и добавил быстрое исправление, которое решит мою конкретную проблему, но не уверен, какой будет стук в эффекты. Если бы член команды aurelia мог проверить, это было бы хорошо:
https://github.com/Magrangs/dependency-injection/commit/56c7d96a496e76f330a1fc3f9c4d62700b9ed596