Как добавить сервисные макеты в валидацию реестра структуры карты?

У меня есть несколько компонентов, которые запускаются

ObjectFactory.AssertConfigurationIsValid()

при запуске проверки одного реестра. Проблема в том, что для выполнения этой задачи каждый раз требуется 20 секунд. Я добавил валидацию в отдельный проект с интеграционными тестами.

Есть некоторые сервисы, которые взаимодействуют с NServiceBus и требуют ссылки на сервисы, добавленные в проект. В реестре я объявляю их так:

For<IAmAService>().LifecycleIs(new NServiceBusThreadLocalStorageLifestyle()).Use(() => new AmAServiceClient());

Когда я запускаю этот тест, я получаю исключение, подобное этому:

StructureMap.StructureMapException: Код исключительной ситуации StructureMap: 207

Внутреннее исключение при создании экземпляра '8872f479-f8c2-4cea-85e3-8ecd85537dac' для PluginType MyProject.IAmAService, MyProject, Version=3.2.0.999, Culture= нейтральный, PublicKeyToken=null. Проверьте внутреннее исключение для более подробной информации. ---> System.InvalidOperationException: Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт "MyProject.IAmAService" в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или из-за того, что в клиентском элементе не найден элемент конечной точки, соответствующий этому контракту.

Я обратился за помощью к странице структуры карты и решил использовать макеты для этих сервисов:

private Establish ctx = () =>
{
    ObjectFactory.ResetDefaults();

    var fakeService = fake.an<IAmAService>();

    ObjectFactory.Initialize(x => x.IncludeRegistry<Registry>());
    ObjectFactory.Inject(fakeService);
};

Но это не сработало. Я все еще получаю то же исключение. Я попробовал это, потому что я думал, что это похоже, но HybridLifycycle не работал для меня (все то же исключение, так что я думаю, что это не главное).

Некоторые замечания:

  • разделение реестра для каждого компонента на самом деле не вариант
  • Я не хочу добавлять сервисные ссылки в проект интеграционных тестов. Мне нужны интеграционные тесты, чтобы не было зависимостей

Учитывая все это: что я могу сделать?

1 ответ

Решение

Коллега на работе предложил простой тест:

  1. Мы закомментировали экземпляр в проверенном реестре и запустили тест. Это прошло.
  2. Затем мы добавили новую регистрацию в реестр, ту же службу, но без метода жизненного цикла, прокомментировали старую и запустили тест. Как и в начале, это не удалось.
  3. Затем мы прокомментировали внедрение в части теста "Установить", но сохранили оба экземпляра в проверенном реестре - это снова не удалось.

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

private Establish ctx = () =>
{
    ObjectFactory.ResetDefaults();

    var fakeService = fake.an<IAmAService>();

    ObjectFactory.Initialize(x => x.IncludeRegistry<Registry>());
    ObjectFactory.EjectAllInstancesOf<IAmAService>();
    ObjectFactory.Inject(fakeService);
};

Это сработало.

Другие вопросы по тегам