如何模拟无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
相关产品推荐
相关产品推荐

