Как добавить сервисные макеты в валидацию реестра структуры карты?
У меня есть несколько компонентов, которые запускаются
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 ответ
Коллега на работе предложил простой тест:
- Мы закомментировали экземпляр в проверенном реестре и запустили тест. Это прошло.
- Затем мы добавили новую регистрацию в реестр, ту же службу, но без метода жизненного цикла, прокомментировали старую и запустили тест. Как и в начале, это не удалось.
- Затем мы прокомментировали внедрение в части теста "Установить", но сохранили оба экземпляра в проверенном реестре - это снова не удалось.
Мы предполагали, что нашим решением будет заменить старый экземпляр в реестре новым, не добавляя новый.
private Establish ctx = () =>
{
ObjectFactory.ResetDefaults();
var fakeService = fake.an<IAmAService>();
ObjectFactory.Initialize(x => x.IncludeRegistry<Registry>());
ObjectFactory.EjectAllInstancesOf<IAmAService>();
ObjectFactory.Inject(fakeService);
};
Это сработало.