これは些細なことである必要がありますが、TDD にまったく慣れていないため、適切な方法がわかりません。
起動プロセスの一部として、指定されたフォルダー内の DLL を検索してメイン メニュー バーに動的に入力する WinForms アプリケーションがあるとします。
これらの DLL は単なるプラグインです。それらはすべてインターフェイスを実装し、すべてメニュー エントリとして表示されます。それは本当にそれと同じくらい簡単です。
各 DLL を a と呼びましょうModule
。
Module
さて、私は「おい、スティーブ、このオブジェクトをモックする必要があるだろう。 という名前のインターフェースを定義しIModule
て、Module
クラスにそれを実装させよう。そうすれば、好きなようにそれらをモックできる」と思いました。
IModule
具体的には、コードを数行書きましょうModule
(コンパイラのサポートなしでストレートに書いているため、コンパイルされない可能性があります)。
<!-- language: c# -->
public interface IModule {
string Id { get; }
string DisplayName { get; }
}
public class Module : IModule {
public string Id { get; }
public string DisplayName { get; }
public string Path { get; private set; }
public Module(FileInfo path) {
Path = path.FullName;
}
}
そして、実際の読み込みを行うクラスを実装しましょう。
public class ModuleLoader {
IEnumerable<DirectoryInfo> SearchPaths;
public ModuleLoader(IEnumerable<DirectoryInfo> searchPaths) {
SearchPaths = searchPaths;
}
public IEnumerable<IModule> LoadModules() {
var modules = SearchPaths
.Where(dir => dir.Exists)
.SelectMany(dir => dir.GetFiles("*.dll").Select(dll => new Module(dll)));
return modules;
}
}
ここで問題がLoadModules()
発生します。私が収集した情報によると、分散の問題が原因でコンパイルされません。
エラーメッセージは次のとおりです。
型 System.Collections.Generic.IEnumerable<Module> を System.Collections.Generic.IEnumerable<IModule> に暗黙的に変換することはできません
これは、この質問と同じです。
今、私を逃れる些細な何かがあるに違いありません。私の知る限りでは、LoadModules()
返品IEnumerable<IModule>
は Good Thing™ とみなされます。もちろん、戻り値の型を変更するIEnumerable<Module>
と、コードはコンパイルされますが、問題は単体テストに移動するだけです。
私は少し混乱しており、すべて間違っているかもしれません (そうであれば申し訳ありません)。
それで、あなたはこれについてどうしますか?どうすればModule
モック可能にできますか?