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

如何模拟无getter的表达式体成员(不修改原有代码)

问题:不修改原类的前提下模拟表达式体属性的值

背景

我有一个包含表达式体成员的类:

public class MyState 
{
    public List<Thing> Things { get; set; }
    public double SomeValue => Things.Sum(thing => thing.Value);
    public double MyProperty { get; set; }
}

需要为Apply()方法编写单元测试,该方法签名如下:

public class OtherClass 
{
    public override MyList Apply(MyState state) {
        state.MyProperty = state.SomeValue;
        return null;
    }
}

初次尝试

public void Test()
{
    var mock = new Mock<MyState>();
    mock.SetupGet(mock => mock.SomeValue).Returns(100.0);

    var otherClass = new OtherClass();
    otherClass.Apply(mock.Object);

    ...
}

运行测试报错,提示SomeValue是非可重写成员。

二次尝试

我定义了接口IMyState:

public interface IMyState 
{
    double SomeValue { get; set; }
    double MyProperty { get; set; }
}

修改测试让模拟对象实现该接口,但调用Apply()时出错,因为**Apply方法接收的是MyState实例而非IMyState**:

public void Test()
{
    var mock = new Mock<MyState>().As<IMyState>();        // 让模拟对象实现接口
    mock.SetupGet(mock => mock.SomeValue).Returns(100.0);

    var otherClass = new OtherClass();
    otherClass.Apply(mock.Object);                       // mock.Object 类型为 IMyState,无法匹配参数类型

    ...
}

推测原因是MyState并未实际实现IMyState。核心诉求:能否在不修改MyState(不实现IMyState、不将SomeValue声明为virtual)的前提下,模拟该属性返回指定值?我不想仅为测试修改原有业务代码。

三次尝试

我尝试将模拟对象强制转换为MyState后传入Apply(),但SomeValue返回0而非设置的100.0:

public void Test()
{
    var mock = new Mock<MyState>().As<IMyState>();
    mock.SetupGet(mock => mock.SomeValue).Returns(100.0);

    var otherClass = new OtherClass();
    otherClass.Apply((MyState)mock.Object);  // 转换后,mock.Object.SomeValue 返回0

    ...
}

内容的提问来源于stack exchange,提问作者Ava Stark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:43:29