2011-09-24 44 views
0

在我的項目中,我有一個IoC容器,通過ServiceModule以通常的方式進行初始化。當我編寫單元測試時,我希望能夠綁定到StrictMock,DynamicMock,PartialMock或Stub。在過去,我有一個FakeServiceModule,它將所有內容綁定到StrictMocks,但這是非常嚴格的,我想擴展它以允許創建我選擇的模擬類型。Ninject和動態WithConstructor/WithMeta和RhinoMocks

爲了實現這一點,我創建了以下內容。

public class NinjectMocking 
{ 
    public Type TypeToMock { get; set; } 
    public MockType MockTypeToUse { get; set; } 
    public IBindingWithOrOnSyntax<Type> BindingWithOrOnSyntax { get; set; } 
} 

public enum MockType 
{ 
    Stub, 
    Strict, 
    Dynamic, 
    Partial 
} 

的想法是,我會初始化像這樣的假服務模塊:

 foreach (var mockType in _mocks) 
     { 
      object ninjaMock; 

      switch (mockType.MockTypeToUse) 
      { 
       case MockType.Strict: 
        { 
         ninjaMock = _mockRepository.StrictMock(mockType.TypeToMock); 
         break; 
        } 
       case MockType.Dynamic: 
        { 
         ninjaMock = _mockRepository.DynamicMock(mockType.TypeToMock); 
         break; 
        } 
       case MockType.Partial: 
        { 
         ninjaMock = _mockRepository.PartialMock(mockType.TypeToMock); 
         break; 
        } 
       case MockType.Stub: 
        { 
         ninjaMock = _mockRepository.Stub(mockType.TypeToMock); 
         break; 
        } 
       default: 
        { 
         ninjaMock = _mockRepository.StrictMock(mockType.TypeToMock); 
         break; 
        } 
      } 

      if (mockType.BindingWithOrOnSyntax == typeof(ConstructorArgument)) 
       Bind(mockType.TypeToMock).ToMethod(m => ninjaMock).w 
        .WithConstructorArgument(mockType.BindingWithOrOnSyntax); 

      else 
       Bind(mockType.TypeToMock).ToMethod(m => ninjaMock); 
     } 

已initliazed用嘲笑的列表...

 NinjectMocking ninjectMocking = new NinjectMocking(); 
     ninjectMocking.TypeToMock = typeToAdd; 
     ninjectMocking.MockTypeToUse = MockType.Dynamic; 

這一切工作完美。但是,這裏問題來了,我們的一些綁定的需要或者.WithConstructorArgument或.WithMetaData在

 Bind<ISomeRepository>().ToMethod(m => someRepository) 
     .WithConstructorArgument("context", ctx => new TestDataContext()); 

,並在未來,也許一些人。這就是爲什麼我在NinjectMocking類中具有BindingWithOrOnSyntax屬性的原因。所以我的新的初始化可能是這個樣子:

 NinjectMocking ninjectMocking = new NinjectMocking(); 
     ninjectMocking.TypeToMock = typeToAdd; 
     ninjectMocking.MockTypeToUse = MockType.Dynamic; 
     ninjectMocking.BindingWithOrOnSyntax.WithConstructorArgument("context", constructorArgument); 

的問題是我不知道如何使它使用的綁定。我想要做的是一樣的東西

綁定(mockType.TypeToMock).ToMethod(M => ninjaMock)。[WhatGoesHere]

我真的不知道如何使用[WhatGoesHere]做位,或者如何定義綁定,以便它在BindingWithOrOnSyntax屬性中使用我傳入的任何內容。我最後一次絕望的嘗試是嘗試強迫它通過類似於

  if (mockType.BindingWithOrOnSyntax == typeof(ConstructorArgument)) 
       Bind(mockType.TypeToMock).ToMethod(m => ninjaMock) 
        .WithConstructorArgument(mockType.BindingWithOrOnSyntax); 

但這顯然不起作用。

任何指向正確的方向,或者即使有更好的方法來實現這一點,將不勝感激。

回答

2

在單元測試期間不要使用IOC容器。 IOC容器將在運行時用於將您的依賴關係注入到組件中。在單元測試期間,you使用模擬/存根依賴關係創建組件。如果您的組件直接從IOC容器解析依賴項,那麼您沒有正確使用該容器。