How to mock an out parameter with It.IsAny<> with Moq?

问题描述 投票:0回答:2

我想验证一个方法只被调用一次。

mock.Verify(x => x.Method("String", out It.IsAny<StringBuilder>()), Times.Once);

我不关心第二个参数,它可以是任何东西。

由于

out
参数,我收到以下错误消息:

'out' 参数必须是可分配的变量、字段或数组元素

unit-testing moq out
2个回答
1
投票

尝试按照错误消息说明进行操作,并将 out 参数放入变量中。

var builder = new StringBuilder();
mock.Verify(x => x.Method("String", out builder), Times.Once);

这里是一个完整的例子,在测试时通过。

[TestClass]
public class ExampleTest {
    public interface IInterface {
        void Method(string p, out StringBuilder builder);
    }

    public class MyClass {
        private IInterface p;

        public MyClass(IInterface p) {
            this.p = p;
        }

        public void Act() {
            var builder = new StringBuilder();
            p.Method("String", out builder);
        }
    }

    [TestMethod]
    public void Should_Ignore_Out() {
        //Arrange
        var mock = new Mock<IInterface>();
        var sut = new MyClass(mock.Object);

        //Act
        sut.Act();

        //Assert
        var builder = new StringBuilder();
        mock.Verify(x => x.Method("String", out builder), Times.Once);
    }
}

0
投票

您可以使用

It.Ref<StringBuilder>.IsAny
验证 Any。在您的情况下,解决方案如下:

mock.Verify(x => x.Method("String", out It.Ref<StringBuilder>.IsAny), Times.Once);

这个功能是在Moq 4.8.0-rc1中添加的

© www.soinside.com 2019 - 2024. All rights reserved.