Tôi nghĩ @ Hitchhiker đang đi đúng hướng, nhưng tôi cũng muốn suy nghĩ về việc tóm tắt những thứ như thế chỉ một bước xa hơn.
Tôi sẽ không loại bỏ trực tiếp TcpClient, vì điều đó sẽ vẫn buộc bạn quá chặt chẽ với việc triển khai cơ bản ngay cả khi bạn đã viết các bài kiểm tra. Đó là, việc triển khai của bạn được gắn với một phương thức TcpClient cụ thể. Cá nhân, tôi sẽ cố gắng một cái gì đó như thế này:
[Test]
public void TestInput(){
NetworkInputSource mockInput = mocks.CreateMock<NetworkInputSource>();
Consumer c = new Consumer(mockInput);
c.ReadAll();
// c.Read();
// c.ReadLine();
}
public class TcpClientAdapter : NetworkInputSource
{
private TcpClient _client;
public string ReadAll()
{
return new StreamReader(_tcpClient.GetStream()).ReadToEnd();
}
public string Read() { ... }
public string ReadLine() { ... }
}
public interface NetworkInputSource
{
public string ReadAll();
public string Read();
public string ReadLine();
}
thực hiện này sẽ tách bạn khỏi TCP liên quan chi tiết hoàn toàn (nếu đó là một mục tiêu thiết kế), và bạn thậm chí có thể ống ở đầu vào thử nghiệm từ một tập cứng mã hóa các giá trị hoặc tệp đầu vào thử nghiệm. Rất tay nếu bạn đang trên đường thử nghiệm mã của bạn cho một đoạn đường dài.
Điều này thật hoàn hảo! Cảm ơn! –
+1 giải thích tốt nhất cùng với ví dụ đơn giản tốt đẹp – Ahmad
cảm ơn @funkymushroom, cố định –