Nó không phải là một bài kiểm tra đơn vị nếu nó đang nghe một ổ cắm. Quấn khách hàng và với một lớp mỏng và làm việc với một mô hình thay thế. Bằng cách này bạn có thể giả mạo tất cả các dữ liệu nhận được mà bạn muốn.
Ví dụ: Mocking ổ cắm (giản thể ví dụ):
Tạo một ISocket giao diện với tất cả các phương pháp bạn cần:
public interface ISocket
{
ISocket Accept(int port);
byte[] Receive(int numberOfBytes);
bool Send(byte[] data);
void Disconnect();
bool Connect(string address, int port);
}
Bây giờ tạo ra một lớp TcpSocket bê tông thực hiện ISocket:
public class TcpSocket : ISocket
{
private Socket socket;
public TcpSocket()
{
socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
}
// implement all methods of ISocket by delegating to the internal socket
}
Bất cứ nơi nào bạn bình thường sử dụng một System.Net.Sockets.Socket, vượt qua một ISocket thay thế. Khi bạn cần tạo mới một Socket sử dụng TcpSocket. Nếu bạn tạo các ổ cắm sâu bên trong ruột của hệ thống, bạn có thể muốn tạo một nhà máy thay vì tạo một TcpSocket trực tiếp. Dưới thử nghiệm, bạn có thể vượt qua một thực hiện khác nhau của ISocket (Mock) (có thể được tạo ra thông qua nhà máy). Bạn có thể thực hiện mô hình của riêng bạn bằng cách tạo ra một triển khai thứ hai của ISocket được gọi là MockSocket, nó trả về dữ liệu kiểm tra trong Receive hoặc bạn có thể sử dụng trên vô số các khuôn mẫu giả để làm điều đó cho bạn.
public class MockSocket : ISocket
{
private byte[] testData;
public void SetTestData(byte[] data)
{
testData = data;
}
public byte[] Receive(int numberOfBytes)
{
return testData;
}
// you need to implement all members of ISocket ofcourse...
}
sức này thấy giống như rất nhiều nỗ lực, nhưng trong tất cả nhưng hệ thống đồ chơi các api ranh giới nên được ẩn đằng sau một lớp mỏng không chỉ để thử nghiệm nhưng cũng ở lại linh hoạt. Nếu, ví dụ, bạn muốn sử dụng một thư viện socket mạnh hơn thay vì System.Net.Socket bạn có thể làm cho TcpSocket sử dụng mà không cần phải thay đổi mọi cách sử dụng các socket trong mã của riêng bạn. Đây cũng là lý do tại sao lập trình cho giao diện thay vì lập trình để triển khai thực hiện cụ thể thường là một ý tưởng hay: bạn có thể dễ dàng chuyển đổi triển khai (nhưng điều đó không có nghĩa là bạn nên tạo giao diện cho TẤT CẢ các lớp của bạn). Nếu tất cả điều này gây nhầm lẫn cho bạn, hãy đọc thêm về chế nhạo (như ở đây: http://en.wikipedia.org/wiki/Mock_object)
Tôi nghĩ bạn phải thực sự kết nối trên ổ cắm ...? Có lẽ tôi đang thiếu câu hỏi của bạn, nhưng chỉ cần mở một ổ cắm khác, gọi kết nối, và gửi một số dữ liệu ...? – Aerik
Đây chính xác là câu hỏi này là gì: tôi có nên mở ổ cắm hay tôi nên thử toàn bộ giao diện TCP. Tôi nghĩ rằng một thử nghiệm thích hợp không nên sử dụng một nguồn lực hạn chế như giao diện mạng .. hoặc tôi sai. – emesx