Ken*_*enn 0 c# mstest moq unity-container
我试图模拟一个统一容器 - 我使用Moq并得到这个错误
System.ArgumentException: Invalid setup on a non-overridable member:
c => c.Resolve<ILogisticsAdapter>(new [] {})
Run Code Online (Sandbox Code Playgroud)
这是我测试的设置部分的代码.
var mockContainer = new Mock<IUnityContainer>();
mockContainer.Setup(c => c.Resolve<ILogisticsAdapter>()).Returns(logicsticsAdapter);
IUnityContainer container = mockContainer.Object;
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我不是一般的模拟或单元测试的主人,但从我能说的这应该工作......
以防万一我使用VS2010和MS测试...
谢谢
这是整个测试夹具 - 你可以看到我已经改变它以使用真正的统一容器,但理想情况下我不想创建一个真正的统一容器 - 它不是我正在测试的.但是你可以看到我注释掉的代码......
[TestMethod]
public void WhenContructed_AdapterGetsSet()
{
//Prepare
ILogisticsAdapter logicsticsAdapter = new Mock<ILogisticsAdapter>().Object;
var mockEventAggregator = new Mock<IEventAggregator>();
mockEventAggregator.Setup(x => x.GetEvent<SetHelpMessageEvent>()).Returns(new SetHelpMessageEvent());
IEventAggregator eventAggregator = mockEventAggregator.Object;
IRegionManager regionManager = new Mock<IRegionManager>().Object;
//var mockContainer = new Mock<IUnityContainer>();
//mockContainer.Setup(c => c.Resolve<ILogisticsAdapter>(null)).Returns(logicsticsAdapter);
//IUnityContainer container = mockContainer.Object;
IUnityContainer container = new UnityContainer();
container.RegisterInstance<ILogisticsAdapter>(logicsticsAdapter);
container.RegisterInstance<IRegionManager>(regionManager);
container.RegisterInstance<IEventAggregator>(eventAggregator);
//Act
var warehouseOrdersViewModel = new WarehouseOrdersViewModel_Accessor(container);
Assert.IsNotNull(warehouseOrdersViewModel.logisticsAdapter);
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我非常同意上述评论者的意见 - 你不应该(在大多数情况下)在引导程序之外的任何地方引用容器.在您的情况下,看起来您正在实现类的视图模型定位器类型,所以它可能没问题.但是,请仔细考虑这是否是正确的做法.通常使用显式工厂或通过容器注入Func将使您获得相同的位置,而无需将您明确地耦合到容器.
话虽如此,如果您使用的是Unity 2.0,请仔细查看IUnityContainer界面.你会看到你试图模拟的方法实际上并不在界面上.这是一种扩展方法.IUnityContainer实际上只有一个"本机"解析方法:
object Resolve(Type t, string name, params ResolverOverride[] resolverOverrides);
Run Code Online (Sandbox Code Playgroud)
因此,您需要专门模拟该方法.扩展方法只是做一些参数杂乱并转向并直接在接口上调用Resolve.
您可能仍会遇到问题 - 在.NET框架中实际存在一个错误,当代码生成具有返回接口的方法的接口的实现时会导致问题,即RegisterType,RegisterInstance以及IUnityContainer上的所有其他方法.这与我现在所知的所有模拟框架有关.如果你这样做,唯一的选择就是手动模拟 - 编写一个自己实现IUnityContainer的类,而不是使用模拟框架来实现它.
| 归档时间: |
|
| 查看次数: |
2182 次 |
| 最近记录: |