プロジェクトで DI コンテナーとして Autofac を使用しています。今、Moqを使用して単体テストを作成し始めました。ビジネスクラスのコードはすでに書かれているので、ビジネスクラスの大幅な変更は避けたいと思います。System.IO.XXX クラス (FileSystemWatcher、Directory、File、StreamReader など) をモックする際に問題に直面しています。ほとんどの場合、静的クラスであるか、インターフェイスがないためです。
// これは、私のビジネス クラスの 1 つがどのように見えるかです
internal class SpanFileReader : ISpanFileReader
{
// Some private variables
private string _filePath;
private readonly ISpanLogger _spanLogger;
#region Public Properties
// Prorperties....
#endregion
#region Constructor
public SpanFileReader(string filePath)
{
_filePath = filePath;
_spanLogger = IocContainer.Instance.Container.Resolve<ISpanLogger>();
}
#endregion
#region Public Methods
public bool ReadSpanRecords(CancellationToken ct)
{
try
{
if (!VerifySpanFile())
return false;
_spanFileLines = new List<string>();
using (var streamReader = new StreamReader(_filePath))
{
while (!streamReader.EndOfStream)
{
// some logic
}
return true;
}
}
catch (OperationCanceledException operationCanceledException)
{
_spanLogger.UpdateLog("some message");
throw;
}
catch (Exception ex)
{
_spanLogger.UpdateLog("some message);
throw;
}
}
public void MoveFileToErrorFolder(string spanFileName)
{
var spanFilePath = AppConfiguration.SpanFolderPath + spanFileName;
var errorFilePath = AppConfiguration.SpanErrorFolderPath + spanFileName;
try
{
if (File.Exists(spanFilePath))
{
if (!File.Exists(errorFilePath))
{
_spanLogger.UpdateLog("some message");
File.Move(spanFilePath, errorFilePath);
_spanLogger.UpdateLog("some message");
}
else
{
File.Delete(spanFilePath);
_spanLogger.UpdateLog("some message");
}
}
else
{
_spanLogger.UpdateLog("some message");
}
}
catch (Exception ex)
{
_spanLogger.UpdateLog("some message");
throw ex;
}
}
}
ここで、 Autofac を使用していくつかのインターフェイス ( IStreamReader など) を介してそのインスタンスを解決できるように、 StreamReader() を使用したいと思います。そのため、SpanFileReader()の単体テストを作成しているときに、 IStreamReader のMoq インスタンスをコンテナーに登録し、実際のインスタンスの代わりに使用できます。SUT ( SpanFileReaderインスタンス)のテスト時に呼び出される独自の moq 実装を提供できるように、 File()クラスでも同様のことを行いたいと考えています。誰かがこれらのシナリオに対処するための適切な方法を提案できますか.