Moq模拟buffer[]参数

本文关键字:参数 buffer 模拟 Moq | 更新日期: 2023-09-27 18:08:39

我正在尝试模拟套接字的接收方法。

这是我用来让模拟工作的解决方案。

public class Test_MockSocket : Socket
{
    public Test_MockSocket() : base (
                    (new IPEndPoint(IPAddress.Parse("127.0.0.1"), 30000)).AddressFamily,
                    (SocketType.Stream),
                    (ProtocolType.Tcp))
    {
    }
}

,这是测试的当前版本:

   [Test]
    public void ShouldReadFromSocket()
    {
        byte[] thingy = null;
        var Mock = new Mock<Test_MockSocket>();
        Mock.Setup(foo => foo.Receive(It.IsAny<byte[]>())).Returns(1);
        Socket MockSocket = (Socket)Mock.Object;
        Assert.AreEqual(1, MockSocket.Receive(thingy));
    }

我想用这个模拟一个接收过程,但是我失败了,只是尝试这个简单的响应。失败是"系统"。NotSupportedException:在非虚拟(在VB中可重写)成员上无效的设置:foo => foo. receive (It.IsAny())"

为什么我的设置是错误的,我需要改变什么来返回一个文本字符串作为byte[]缓冲区参数

Moq模拟buffer[]参数

只能在上模拟虚拟方法和属性。可以模拟接口上的任何成员。Socket类上的Receive方法没有被声明为virtual,所以Moq不能在代码中注入行为。

因为。net框架类通常不适合模拟,我的理解是(无可否认,这是有限的),您希望为您的通信创建一个抽象层。因此,您不必直接处理套接字,而是处理您自己的一组接口和类,这些接口和类隐藏了通信的所有复杂性。它不仅使mock更容易,而且使您的通信更容易与其他技术互换,因为您的类是松耦合的。

接口要比类容易得多,也就是说,除非你的类是一个抽象类,或者是具有默认实现和用于扩展的虚成员的基类。