2015-11-12 3 views
0

Я создаю настройку для AutoFixture. Я хочу зарегистрировать тип/экземпляр с переданным в IFixture, но только если он еще не зарегистрирован. Это возможно?Проверьте, зарегистрирован ли тип в устройстве Fixture

То есть, можно ли проверить, зарегистрирован ли какой-либо конкретный тип/экземпляр с помощью IFixture AutoFixture?

Лучшее обходное решение, которое у меня есть, - это попытаться вызвать fixture.Create() и поймать ObjectCreationException, которое возникает, если тип не зарегистрирован. Как вы можете себе представить, это не самые изящные решения, поэтому я прошу здесь о лучшем.

+0

* Это возможно? * Не совсем ... Что вы пытаетесь сделать? В 6 лет я использовал AutoFixture, я не думаю, что мне когда-либо понадобилась эта функция ... –

+0

OK, просто убедившись. Я реализую ITestOutputHelper в xUnit. Чтобы быть более конкретным, я хочу выводить сообщения, которые происходят на этапе DataDiscoverer.GetData. ICustomizer устанавливает интерфейс ILogger (действующий как IoC) на IFixture. Если ILogger уже зарегистрирован в IFixture, я хочу создать CompositeLogger и использовать его вместо этого. Таким образом, я не переписываю никаких существующих регистраций/функциональных возможностей, но перемещаю их в CompositeLogger. Надеюсь, это имеет смысл. :) Я могу немного проверить код, чтобы показать вам фактическую реализацию. –

+0

FWIW, я не использовал CompositeLogger и [использовал регистрацию вместо этого] (https://github.com/DragonSpark/Framework/blob/4767b6fcfc1df1df84c30e7e17a6046e2af0326b/DragonSpark.Testing.Framework/OutputCustomization.cs), чтобы получить все известные регистраторы в пределах тестового контекста в конце теста. –

ответ

1

Как @ mark-seemann ответил на комментарий к вопросу, в настоящее время это невозможно. На данный момент самым известным решением является попытка выполнить wrap the Fixture's Create call in a try-catch and return null on the ObjectCreationException.

public static T TryCreate<T>(this IFixture @this, Type type) 
{ 
     try 
     { 
      var result = (T)new SpecimenContext(@this).Resolve(type); 
      return result; 
     } 
     catch (ObjectCreationException) 
     { 
      return default(T); 
     } 
} 
Смежные вопросы