Giả sử giao diện IReader, triển khai giao diện IReader ReaderImcellenceation và một lớp ReaderConsumer tiêu thụ và xử lý dữ liệu từ đầu đọc.
public interface IReader
{
object Read()
}
Thực hiện
public class ReaderImplementation
{
...
public object Read()
{
...
}
}
Khách hàng:
public class ReaderConsumer()
{
public string location
// constructor
public ReaderConsumer()
{
...
}
// read some data
public object ReadData()
{
IReader reader = new ReaderImplementation(this.location)
data = reader.Read()
...
return processedData
}
}
Để kiểm tra ReaderConsumer và quá trình xử lý, tôi sử dụng một mock của IReader. Vì vậy, ReaderConsumer trở thành:
public class ReaderConsumer()
{
private IReader reader = null
public string location
// constructor
public ReaderConsumer()
{
...
}
// mock constructor
public ReaderConsumer(IReader reader)
{
this.reader = reader
}
// read some data
public object ReadData()
{
try
{
if(this.reader == null)
{
this.reader = new ReaderImplementation(this.location)
}
data = reader.Read()
...
return processedData
}
finally
{
this.reader = null
}
}
}
Trong giải pháp này, mocking giới thiệu một câu if cho mã sản xuất vì chỉ có hàm tạo mô phỏng cung cấp một thể hiện của giao diện.
Trong quá trình viết này, tôi nhận ra rằng khối thử cuối cùng có phần không liên quan vì nó ở đó để xử lý người dùng thay đổi vị trí trong thời gian chạy ứng dụng.
Nhìn chung, nó cảm thấy có mùi, làm thế nào nó có thể được xử lý tốt hơn?
ReaderConsumer
độc lập trênReaderImplementation
?