2

これは些細なことである必要がありますが、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モック可能にできますか?

4

1 に答える 1

2

varに置き換えてIEnumerable<IModule>、に置き換える必要がnew Module(dll)あります(IModule) (new Module(dll))

于 2012-04-27T19:19:20.553 に答える