これは、すべてSRP (Single Responsibility Principle)に準拠するさまざまな方法で構成できます。
1 つの方法は次のとおりです。レポート識別子を受け取り、インスタンスIReportLoadingService
を返すメソッドを使用して、 1 つのインターフェイス を持ちます。IReport
これの実装は、依存関係としてIReportLoadingService
持つことができます。IReportDefinitionRetrievalService
public class ReportLoadingService : IReportLoadingService
{
private readonly IReportDefinitionRetrievalService _definitionService;
public ReportLoadingService(IReportDefinitionRetrievalService definitionService)
{
_definitionService = definitionService;
}
public IReport GetReport(string reportName)
{
var reportDefinition = definitionService.GetDefinition(reportName);
return GenerateReportFromDefinition(reportDefinition);
}
private IReport GenerateReportFromDefinition(string definition)
{
// Logic to construct an IReport implementation
}
}
のライブ実装はIReportDefinitionRetrievalService
、データベースにアクセスして XML を返します。これで、別のサービスが実際にレポート定義を取得する責任を負いながら、インスタンスにデータを入力する責任が発生しますReportLoadingService
。IReport
単体テストでは、必要なことを実行する のモックを作成できますIReportDefinitionRetrievalService
(辞書で定義を検索するなど)。優れたモッキング フレームワークについては、Moqを参照してください。次のようなことができるようになります。
[Test]
public void GetReportUsesDefinitionService()
{
var mockDefinitionService = new Mock<IReportDefinitionRetrievalService>();
mockDefinitionService.Setup(s => s.GetDefinition("MyReportName")).Returns("MyReportDefinition");
var loadingService = new ReportLoadingService(mockDefinitionService.Object);
var reportInstance = loadingService.GetReport("MyReportName");
// Check reportInstance for fields etc
// Check the definition service was used to load the definition
mockDefinitionService.Verify(s => s.GetDefinition("MyReportName"), Times.Once());
}