2009-11-30 10 views

Odpowiedz

6

OK Zbudowałem go samodzielnie, wykorzystując integrację Moq jako punkt wyjścia. To bardzo proste. Musisz te 3 klasy:

public class AutoMockingKernel : StandardKernel 
{ 
    private readonly IMockProvider _mockProvider; 

    public void Reset() 
    { 
     Components.Get<ICache>().Clear(); 
    } 

    protected override bool HandleMissingBinding(Type service) 
    { 
     var isSelfBindable = TypeIsSelfBindable(service); 

     var binding = new Binding(service) 
     { 
      ProviderCallback = isSelfBindable 
           ? StandardProvider.GetCreationCallback(service) 
           : _mockProvider.GetCreationCallback(), 
      IsImplicit = true 
     }; 

     if (!isSelfBindable) 
      binding.ScopeCallback = ctx => null; 

     AddBinding(binding); 

     return true; 
    } 

    public AutoMockingKernel(IMockProvider mockProvider, INinjectSettings settings, params INinjectModule[] modules) 
     : base(settings, modules) 
    { 
     _mockProvider = mockProvider; 
    } 

    public AutoMockingKernel(IMockProvider mockProvider, params INinjectModule[] modules) 
     : base(modules) 
    { 
     _mockProvider = mockProvider; 
    } 
} 

internal class RhinoMockProvider : IProvider 
{ 
    public Type Type { get; private set; } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="RhinoMockProvider"/> class. 
    /// </summary> 
    public RhinoMockProvider(Type type) 
    { 
     Type = type; 
    } 

    public object Create(IContext context) 
    { 
     return MockRepository.GenerateMock(Type, Type.EmptyTypes); 
    } 
} 

public class RhinoAutoMockProvider : IMockProvider 
{ 
    public Func<IContext, IProvider> GetCreationCallback() 
    { 
     return ctx => new RhinoMockProvider(ctx.Request.Service); 
    } 
} 

Następnie można utworzyć jądro auto-szyderczy w badanej jednostki takie jak to:

[Test] 
public void Test() 
{ 
    var kernel = new AutoMockingKernel(new RhinoAutoMockProvider()); 
    ... etc 
} 
+0

W interesie, jak zarządzać wyzwalaniem resetowania w [Teardown]? –

+0

Używam klasy bazowej dla wszystkich moich urządzeń testowych, które wywołują reset podczas rozłączania. Używam również statycznego kontenera jądra. Zdecydowanie nie idealny, ale uważam, że tego typu rzeczy nigdy nie istnieją. – cbp

Powiązane problemy