在我的項目中,我有一個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);
但這顯然不起作用。
任何指向正確的方向,或者即使有更好的方法來實現這一點,將不勝感激。