You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:08:28