2010-03-18 20 views
8

Tôi có một lớp registry như thế này:StructureMap: Làm cách nào tôi có thể kiểm tra lớp đăng ký?

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

Tôi muốn kiểm tra xem cấu hình theo ý định của tôi, vì vậy tôi bắt đầu viết một bài kiểm tra:

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 
    } 
} 

Làm thế nào có thể xác minh rằng đăng ký đang theo đuổi kỳ vọng của tôi? Lưu ý: Tôi đã giới thiệu vùng chứa vì tôi không thấy bất kỳ loại phương pháp xác minh nào có sẵn trên lớp Đăng ký. Ý tưởng, tôi muốn kiểm tra trực tiếp trên lớp đăng ký.

+0

Những khuôn khổ BDD là điều đó không? –

+0

Nó chỉ là một viết lại của nunit. "ThenAttribute" kế thừa từ "TestAttribute" và kịch bản là một TextFixture trừu tượng với các phương thức Given và When được thực hiện trong [SetUp] – Marius

Trả lời

3

Hãy suy nghĩ về một lớp Registry giống như một tệp cấu hình - nó không thực sự có ý nghĩa để kiểm tra nó trong sự cô lập, nhưng bạn có thể muốn kiểm tra cách lớp khác phản ứng với nó. Trong trường hợp này, bạn sẽ kiểm tra cách một Container hoạt động khi được cung cấp một đăng ký, vì vậy bạn đã đi đúng hướng bằng cách đưa Container vào thử nghiệm của bạn.

Trong thử nghiệm, bạn có thể yêu cầu IDateTimeProvider và xác nhận rằng loại cụ thể được trả lại là loại bạn mong đợi. Bạn cũng có thể lấy 2 trường hợp từ thùng chứa và xác nhận rằng chúng là cùng một cá thể (ReferenceEquals) để xác minh hành vi đơn lẻ.

3

Bên trong StructureMap một đăng ký được sử dụng để tạo ra một PluginGraph; vì vậy để kiểm tra đơn vị một registry bạn cần phải kiểm tra xem thiết kế của nó có tạo ra đúng đồ thị hay không. Đáng tiếc là xác minh kiểm tra được thực hiện tốt nhất chống lại một tài sản nội bộ, đây là một ví dụ:

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; 
    } 
} 

kiểm tra đối với một tài sản nội bộ là không bao giờ mong muốn, nhưng trong trường hợp kiểm tra registry của nó là cách tiếp cận tốt nhất mà tôi đã tìm thấy. Phương pháp mở rộng cố gắng đủ thông minh để có thể thực hiện các kiểm tra dựa trên nó không xác định nếu API nội bộ thay đổi.

+0

Phiên bản bản đồ cấu trúc nào là var pluginGraph = registry.Build(); trong? Tôi không có tùy chọn đó .. Tôi đang sử dụng phiên bản

Các vấn đề liên quan