上面的类只模拟你的发送方法。这实际上模拟了一个 Socket。它继承了所有的 Socket,然后实现了 ISocket 接口。 ISocket 需要实现你需要模拟的任何 Socket 方法或属性的签名
//internal because only used for test code
internal class SocketWrapper : Socket, ISocket
{
/// <summary>
/// Web Socket
/// </summary>
public SocketWrapper():base(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
{
}
//use all features of base Socket
}
界面看起来像这样,有两个方法被拒绝:
public interface ISocket
{
void Connect(IPAddress address, int port);
int Send(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode);
}
使用它们的类有 2 个构造函数。一个注入一个 ISocket 进行测试,然后一个注入自己的 Socket 供应用程序使用。
public class HTTPRequestFactory3
{
internal ISocket _socket;
/// <summary>
/// Creates a socket and sends/receives information. Used for mocking to inject ISocket
/// </summary>
internal HTTPRequestFactory3(ISocket TheSocket)
{
_socket = TheSocket as ISocket;
this.Setup();
}
/// <summary>
/// Self Injects a new Socket.
/// </summary>
public HTTPRequestFactory3()
{
SocketWrapper theSocket = new SocketWrapper();
_socket = theSocket as ISocket;
this.Setup();
}
}
然后您的测试可以创建一个 ISocket,设置期望并验证它们是否运行上述类将用于真实套接字的所有相同代码。此测试验证该部分代码。
[Test]
public void NewSocketFactoryCreatesSocketDefaultConstructor()
{
webRequestFactory = new HTTPRequestFactory3();
Assert.NotNull(webRequestFactory._socket);
Socket testSocket = webRequestFactory._socket as Socket;
Assert.IsInstanceOf<Socket>(testSocket);
}