【问题标题】:moq mocking a buffer[] argument最小起订量模拟缓冲区 [] 参数
【发布时间】:2011-11-17 03:20:58
【问题描述】:

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

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

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));
    }

我想用这个来模拟一个接收过程,但是我只是尝试这个简单的响应就失败了。失败是“System.NotSupportedException:非虚拟(在 VB 中可覆盖)成员上的无效设置:foo => foo.Receive(It.IsAny())”

为什么我的设置错误,我需要更改什么以将文本字符串作为 byte[] 缓冲区参数返回。

【问题讨论】:

    标签: c# sockets moq


    【解决方案1】:

    您只能模拟 上的虚拟方法和属性。您可以在 界面 上模拟任何成员。 Socket 类上的 Receive 方法未声明为虚拟,因此 Moq 无法在代码中注入行为。

    因为 .NET 框架类通常不适合模拟,我的理解(诚然,这是有限的)是您想要为您的通信创建一个抽象层。因此,不是直接处理套接字,而是处理自己的一组接口和类,这些接口和类隐藏了通信的所有复杂性。它不仅使模拟更容易,而且由于您的类是松散耦合的,因此您的通信可以轻松地与其他技术互换。

    接口比类更容易起订量,也就是说,除非您的类是抽象类,或者是具有默认实现和用于扩展的虚拟成员的基类。

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多