有人成功mock过.NET中的Socket类吗?我正在尝试在C#中模拟System.net.Sockets.Socket类-我尝试使用NUnit进行模拟,但它无法模拟具体类。我也尝试过使用RhinoMocks,但它似乎使用了该类的真实版本,因为它在调用Send(byte[])时会抛出SocketException。是否有人使用任何模拟框架成功创建和使用了Socket模拟?每当我遇到Moq的这些问题时,我最终都会创建一个接口来抽象出我无法模拟的内容。因此,在您的实例中,您可能有一个实现Send方法的ISocket接口。然后让你的模拟框架模拟。在您的实际代码中,您将像这样拥有classpublicclassMySocket:ISocket{System.Net.Sockets.Socket_socket;publicvoidMySocket(System.Net.Sockets.SockettheSocket){_socket=theSocket;}publicvirtualvoidSend(byte[]stuffToSend){_socket.Send(stuffToSend);不确定这是否符合您的需要,但这是一个选项。调用Send方法时出现SocketException的原因是Send不是可重写的方法。为了让RhinoMocks能够模拟属性或方法的行为,它必须在接口中定义(然后我们创建模拟关闭)或者可以被覆盖。您唯一的解决方案是创建一个可模拟的包装器类(如thinkzig所建议的)。我使用thinkzig(Socket的适配器类)建议的方法创建了一个示例控制台应用程序。它使用RhinoMocks和NUnit。您可以在这里下载:HowtomockSystem.Net.Sockets.Socket。上面的类只是模拟你的发送方法。这实际上模拟了一个套接字。它继承了所有的Sockets,然后实现了ISocket接口。ISocket需要实现您需要模拟的任何Socket方法或属性的签名//internal因为仅用于测试代码internalclassSocketWrapper:Socket,ISocket{//////WebSocket///publicSocketWrapper():base(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp){}//使用基本Socket的所有特性}接口看起来像这样两种方法被拒绝:publicinterfaceISocket{voidConnect(IPAddressaddress,intport);intSend(byte[]buffer,intoffset,intsize,SocketFlagssocketFlags,outSocketErrorerrorCode);使用它们的类有2个构造函数。一个注入一个ISocket用于测试,然后一个注入应用程序以使用它自己的套接字。公共类HTTPRequestFactory3{内部ISocket_socket;//////创建套接字并发送/接收信息。用于模拟注入ISocket///internalHTTPRequestFactory3(ISocketTheSocket){_socket=TheSocketasISocket;这个。设置();}//////自我注入一个新的套接字。///publicHTTPRequestFactory3(){SocketWrappertheSocket=newSocketWrapper();_socket=theSocket作为ISocket;这个。设置();然后你的测试可以创建一个ISocket,设置期望并验证它们运行所有相同的代码,上面的类将使用真正的套接字。此测试验证该部分代码。[测试]publicvoidNewSocketFactoryCreatesSocketDefaultConstructor(){webRequestFactory=newHTTPRequestFactory3();Assert.NotNull(webRequestFactory._socket);套接字testSocket=webRequestFactory._socket作为套接字;您最好在测试中创建一个Assert.IsInstanceOf(}Socket);接口并模拟它,并在您的代码中实现一个包装类,将所有方法调用转发到.NET套接字,如thinkzig所述。查看此链接,同样的问题:HowtomockfilesysteminC#forunittesting?以上是C#学习教程:有没有人成功mock过.NET中的Socket类?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
