1. ホーム
  2. c#

どのようにMOQフレームワークを使用して、C#の静的なメソッドをモックするには?

2023-09-18 07:48:22

質問

最近ユニットテストをやっていて、MOQフレームワークとMS Testを使って様々なシナリオをモックすることに成功しました。私は私たちがプライベートメソッドをテストすることができないことを知っていますが、私は私たちがMOQを使用して静的なメソッドをモックすることができるかどうかを知りたいです。

どのように解決するのですか?

Moq (および他の DynamicProxy -ベースのモッキングフレームワーク) は仮想メソッドや抽象メソッドでないものをモックすることはできません。

シールされた/静的なクラス/メソッドは、Profiler API ベースのツールを使ってのみフェイクすることができます。 タイプモック (商用) や Microsoft Moles (無料、別名 フェイク として知られています)。

代わりに、静的メソッドの呼び出しを抽象化するように設計をリファクタリングし、依存性注入によってクラスにこの抽象化を提供することもできます。そうすれば、より良い設計が得られるだけでなく、Moq のような無料のツールでテスト可能になります。

テスト可能性を可能にする一般的なパターンは、完全にツールを使用せずに適用することができます。次のメソッドを考えてみましょう。

public class MyClass
{
    public string[] GetMyData(string fileName)
    {
        string[] data = FileUtil.ReadDataFromFile(fileName);
        return data;
    }
}

をモック化するのではなく FileUtil.ReadDataFromFile をモック化する代わりに、それを protected virtual メソッドでラップすることができます。

public class MyClass
{
    public string[] GetMyData(string fileName)
    {
        string[] data = GetDataFromFile(fileName);
        return data;
    }

    protected virtual string[] GetDataFromFile(string fileName)
    {
        return FileUtil.ReadDataFromFile(fileName);
    }
}

次に、ユニットテストの中で MyClass を継承し、それを TestableMyClass . そして GetDataFromFile メソッドをオーバーライドして、独自のテストデータを返します。

お役に立てれば幸いです。