如何在C#中配置方法的out参数以返回Mock对象
Moq配置含out参数的方法以返回Mock对象
要让Mock对象的方法通过out参数返回指定的Mock实例(后续可继续配置),需使用Moq提供的Out.Ref或It.Ref来处理out参数,以下是正确实现方式:
正确代码示例
方式一:通过Callback指定out参数返回值
// 提前创建要返回的Mock实例(后续可继续配置它) var randomObjectMock = new Mock<ISmth>(MockBehavior.Strict); // 声明与方法out参数类型匹配的变量 ISmth outInstance; // 配置目标方法,通过Callback设置out参数的返回值为Mock的实例 mock.Setup(x => x.DoSomething(out outInstance)) .Callback(() => outInstance = randomObjectMock.Object);
方式二:直接使用It.Ref简化写法
var randomObjectMock = new Mock<ISmth>(MockBehavior.Strict); // 直接在Setup中通过It.Ref匹配out参数,并在Callback中赋值 mock.Setup(x => x.DoSomething(out It.Ref<ISmth>.IsAny)) .Callback((out ISmth obj) => obj = randomObjectMock.Object);
原有尝试失败的原因
- 第一种写法:直接将
Mock<ISmth>实例传入out参数,与方法定义的ISmth类型不匹配,编译报错。 - 第二种写法:错误地将
Mock<ISmth>赋值给ISmth类型的out变量,未使用.Object属性获取实际接口实例。 - 第三种写法:声明的变量类型是
Mock<ISmth>,但方法的out参数类型应为ISmth,类型不匹配导致失败。
配置完成后,你可以正常对randomObjectMock进行后续的Setup、Verify等操作,当调用DoSomething方法时,out参数会返回该Mock的实例。
内容的提问来源于stack exchange,提问作者Kirill Topchy
相关产品推荐
相关产品推荐

