使用Moq进行单元测试——处理ref参数
处理Moq中ref参数的单元测试实现
要提取并操作ref参数,你可以直接在Moq的Callback中接收该ref参数——It.Ref<Foo>.IsAny是Moq的匹配器,用于匹配任意传入的ref Foo对象,而Callback中的委托会直接拿到实际传入的ref引用,允许你直接修改或重新赋值。
优化后的测试代码
public interface IBar { void ManipulateRefParam(ref Foo foo); } public class Foo { public string Name { get; set; } // 其他成员... } [Fact] public void TestSomething() { // 创建Mock实例 var mockBar = new Mock<IBar>(); // Setup回调,直接操作ref参数 mockBar.Setup(x => x.ManipulateRefParam(ref It.Ref<Foo>.IsAny)) .Callback((ref Foo foo) => { // 可修改现有实例属性,也可重新赋值新对象 foo = foo ?? new Foo(); foo.Name = "ModifiedFoo"; }); // 测试调用:传入待修改的ref参数 var testFoo = new Foo { Name = "Original" }; mockBar.Object.ManipulateRefParam(ref testFoo); // 验证操作结果 Assert.Equal("ModifiedFoo", testFoo.Name); }
关键说明
It.Ref<Foo>.IsAny用于匹配任意传入的ref Foo参数,确保Setup能命中目标方法调用。- Callback中的lambda直接接收ref参数的引用,修改逻辑会同步影响外部传入的变量(因为是ref传递)。
- 如果需要复用处理逻辑,可把操作ref参数的代码抽成单独方法:
void UpdateFoo(ref Foo foo) { foo = foo ?? new Foo(); foo.Name = "ModifiedFoo"; } // 绑定到Callback mockBar.Setup(x => x.ManipulateRefParam(ref It.Ref<Foo>.IsAny)) .Callback(new Action<Foo>(foo => UpdateFoo(ref foo)));
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

