Компоненты тестирования Aurelia с переходными зависимостями никогда не используют макет - PullRequest
2 голосов
/ 29 января 2020

Мы используем тестирование компонента 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

1 Ответ

0 голосов
/ 02 февраля 2020

После разговора с Робом Айзенбергом по этому вопросу существует обходной путь для этой проблемы. Сначала удалите декоратор @transient в классе, а затем в начале своего приложения (обычно main.ts) зарегистрируйте там класс как переходный процесс.

Смотрите тему здесь: https://github.com/Magrangs/dependency-injection/commit/56c7d96a496e76f330a1fc3f9c4d62700b9ed596

Я также обновил репозиторий, размещенный выше: https://github.com/Magrangs/aurelia-transient-dependency-issue

, чтобы включить исправление.

Надеюсь, это поможет любым другим разработчикам, столкнувшимся с тем же вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...