在WPF应用程序中,我有一个视图模型,它使用DevForce实体管理器InvokeServerMethod调用从服务器检索数据。我想通过视图模型进行单元测试。
使用Moq,我模拟了IEntityManagerProvider并设置了InvokeServerMethod。
var mockManager = new Mock<MyEntities>(MockBehavior.Loose, false, null,
EntityServiceOption.UseDefaultService, "Fake");
var mockProvider = new Mock<IEntityManagerProvider<MyEntities>>(MockBehaviour.Loose);
mockProvider.Setup(m => m.Manager).Returns(mockManager.Object);
mockManager
.Setup(m => m.InvokeServerMethod(It.IsAny<ServerMethodDelegate>())
.Returns(new List<int>());但当我做测试的时候
“非虚拟成员上的设置无效”。
接下来,我进入了我的IEntityManagerProvider接口并创建了这个方法
object MockableServerMethod(ServerMethodDelegate method, params object[]
parameters); 然后我实现了这个新方法
public object MockableServerMethod(ServerMethodDelegate method, params
object[] parameters)
{
return Manager.InvokeServerMethod(method, params);
}这允许我模拟服务器调用,但需要我更改生产代码,这是我不应该做的。
当被测试的方法调用InvokeServerMethod()时,编写单元测试的正确方法是什么?
发布于 2018-04-20 13:06:46
我想出了一个更干净的解决方案,尽管它仍然需要修改生产代码。
MyEntities是一个从IdeaBlade.EntityModel.EntityManager继承的部分类。因此,我能够将以下代码添加到MyEntities中
public virtual async Task<object>ExecuteServerMethodAsync(
ServerMethodDelegate method, params object[] parameters)
{
return await InvokeServerMethodAsync(method, parameters);
}现在,我的生产代码调用执行..。而不是调用..。执行方法是可模拟的。
戴夫
https://stackoverflow.com/questions/49928385
复制相似问题