如何使用Moq对WPF中调用DevForce InvokeServerMethod的ViewModel做单元测试?
如何Mock DevForce EntityManager的InvokeServerMethod进行单元测试?
我来帮你搞定这个Mock配置的问题!你已经搭好了Mock的基础框架,接下来只需要完成两步关键配置:让IEntityManagerProvider返回你的Mock EntityManager,然后针对性地MockInvokeServerMethod的行为。
先把你已有的代码放出来,方便后续补充:
var mockManager = new Mock<MyEntities>(MockBehavior.Loose, false, null, EntityServiceOption.UseDefaultService, "Fake"); var mockProvider = new Mock<IEntityManagerProvider<MyEntities>>(MockBehavior.Loose);
第一步:让Provider返回Mock的EntityManager
首先要确保ViewModel从IEntityManagerProvider获取到的是你创建的Mock实例,所以先配置Provider的Manager属性:
mockProvider.Setup(p => p.Manager).Returns(mockManager.Object);
第二步:Mock InvokeServerMethod的行为
DevForce的InvokeServerMethod有多个重载,你需要匹配ViewModel实际调用的版本。下面分两种常见场景给出配置:
场景1:异步调用(InvokeServerMethodAsync)
如果你的ViewModel用的是异步版本,返回Task<T>,可以这样配置:
// 1. 构造测试用的假数据 var fakeResult = new YourDataReturnType(); // 替换成你实际的返回类型 // 2. Mock异步方法的行为 mockManager.Setup(m => m.InvokeServerMethodAsync<YourDataReturnType>( It.IsAny<string>(), // 匹配任意服务器方法名,也可以用It.Is<string>(n => n == "YourRealMethodName")精准匹配 It.IsAny<object[]>(), // 匹配任意参数,也可以指定具体参数或做参数校验 It.IsAny<CancellationToken>() // 匹配任意取消令牌 )).ReturnsAsync(fakeResult);
场景2:同步调用(InvokeServerMethod)
如果是同步版本,直接返回结果即可:
var fakeResult = new YourDataReturnType(); mockManager.Setup(m => m.InvokeServerMethod<YourDataReturnType>( It.IsAny<string>(), It.IsAny<object[]>() )).Returns(fakeResult);
额外提示
- 如果你想让测试更严谨,可以把
It.IsAny<>替换成精准匹配的条件,比如校验方法名是否正确,参数是否符合预期:// 精准匹配方法名为"GetUserInfo",且第一个参数是123 mockManager.Setup(m => m.InvokeServerMethodAsync<UserInfo>( "GetUserInfo", It.Is<object[]>(args => (int)args[0] == 123), It.IsAny<CancellationToken>() )).ReturnsAsync(testUserInfo);
内容的提问来源于stack exchange,提问作者Dave Shine
相关产品推荐
相关产品推荐

