2010-03-18 4 views
8

У меня есть класс реестра, как это:StructureMap: Как я могу тестировать класс реестра?

public class StructureMapRegistry : Registry 
{ 
    public StructureMapRegistry() 
    { 
     For<IDateTimeProvider>().Singleton().Use<DateTimeProviderReturningDateTimeNow>(); 
    } 

Я хочу, чтобы проверить, что конфигурация в соответствии с моим намерением, поэтому я начинаю писать тест:

public class WhenConfiguringIOCContainer : Scenario 
{ 
    private TfsTimeMachine.Domain.StructureMapRegistry registry; 
    private Container container; 

    protected override void Given() 
    { 
     registry = new TfsTimeMachine.Domain.StructureMapRegistry(); 
     container = new Container(); 
    } 

    protected override void When() 
    { 
     container.Configure(i => i.AddRegistry(registry)); 
    } 

    [Then] 
    public void DateTimeProviderIsRegisteredAsSingleton() 
    { 
     // I want to say "verify that the container contains the expected type and that the expected type 
     // is registered as a singleton 
    } 
} 

Как можно проверить, что в реестре соответствует моим ожиданиям? Примечание. Я представил контейнер, потому что не видел каких-либо методов проверки, доступных в классе реестра. Idealy, я хочу протестировать в классе реестра напрямую.

+0

Какие BDD рамки это? –

+0

Его просто переписывать nunit. «ThenAttribute» наследуется от «TestAttribute», а сценарий представляет собой абстрактную TextFixture с методами «Дано» и «Когда выполняется в [SetUp] – Marius

ответ

3

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

В своем тесте вы можете запросить IDateTimeProvider и утверждать, что возвращаемый конкретный тип является типом, который вы ожидаете. Вы также можете извлечь 2 экземпляра из контейнера и утверждать, что они являются одним и тем же экземпляром (ReferenceEquals), чтобы проверить поведение singleton.

3

Внутри StructureMap реестр используется для генерации PluginGraph; поэтому, чтобы протестировать блок реестра, вам нужно проверить, что его дизайн создает правильный граф. К сожалению, тест проверки лучше всего сделать против внутреннего свойства, вот пример:

public interface IFoo {} 

public class SomeFoo : IFoo {} 

public class FooRegistry : Registry 
{ 
    public FooRegistry() 
    { 
    For<IFoo>().Use<SomeFoo>(); 
    } 
} 

[TestFixture] 
public class FooRegistryTests 
{ 
    [Test] 
    public void ForIFoo_UseSomeFoo_AsDefaultInstance() 
    { 
    // Arrange 
    var registry = new FooRegistry(); 

    // Act 
    var pluginGraph = registry.Build(); 
    var iFooPluginFamily = pluginGraph.FindFamily(typeof(IFoo)); 
    var defaultInstance = iFooPluginFamily.GetDefaultInstance(); 

    // Assert 
    Assert.IsTrue(defaultInstance.UsesConcreteType<SomeFoo>()); 
    } 
} 

public static class TestExtensions 
{ 
    public static bool UsesConcreteType<T>(this Instance instance) 
    { 
    var concreteTypeProperty = typeof (Instance).GetProperty("ConcreteType", BindingFlags.Instance | BindingFlags.NonPublic); 
    if (concreteTypeProperty == null || concreteTypeProperty.PropertyType != typeof(Type)) 
    { 
     Assert.Inconclusive("Unable to locate the internal StructureMap.Instance.ConcreteType property"); 
    } 
    var propertyValue = concreteTypeProperty.GetValue(instance, new object[] {}) as Type; 

    return typeof (T) == propertyValue; 
    } 
} 

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

+0

. Какая версия структурной карты является var pluginGraph = registry.Build(); в? У меня нет этого варианта. Я использую версию

Смежные вопросы