2009-11-30 11 views
6

Hat jemand eine Implementierung eines Auto-Mock-Containers mit Rhino Mocks und NInject?Auto-Mock-Container: Rhino Mocks und NInject

+0

ich es sollte alles klar, und dass sein wissen, aber ... Welche Funktionen suchen Sie ? Noch mehr Kontext, den Sie teilen können? –

Antwort

6

OK Ich baute einen selbst mit der Moq-Integration als Ausgangspunkt. Es ist sehr einfach. Sie müssen diese drei Klassen:

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

Sie können dann eine Auto-spöttischen Kernel in Ihrem Unit-Test wie folgt erstellen:

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

Wie verwalten Sie das Auslösen von Reset in [Teardown]? –

+0

Ich benutze eine Basisklasse für alle meine Testgeräte, die Reset während des Teardowns aufrufen. Ich benutze auch einen statischen Kernel-Container. Definitiv nicht ideal, aber ich finde diese Art von Sachen nie ist. – cbp