.Netで静的メソッドをテストする方法

2890 ワード

ほとんどのMokcフレームワークはmock静的手法をサポートしていないが,静的手法をどのようにテストするか.
次のクラスには、静的メソッドが含まれています.
public class MyHelper

{

    public static string GetHelp()

    {

        return "This is help";

    }

}

このクラスは上のHelperクラスの静的メソッドを呼び出します.
public class MyManager

{

    public bool IsManaged { get; set; }

    public void Manage()

    {

        string help = MyHelper.GetHelp();

        IsManaged = (!string.IsNullOrEmpty(help));

    }

}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
MyManagerクラスをテストする必要がある場合はmock MyHelperが必要です.GetHelp()メソッドは、MyHelperクラスが外部から転送できないため、mockフレームワークでmockを使用することもできません.このクラスのManage()メソッドはテストできなくなります.
ソリューション:
1、すべてのコードを変更できる場合、最も簡単な方法は静的メソッドを回避し、静的メソッドをエンティティクラスに移行し、interfaceを使用してインタフェースを分離し、論理を実現することです.
2、静的メソッドを変更できない場合、例えばシステムが提供するヘルプクラスであれば、静的メソッドをエンティティクラスに移行しますが、エージェント関数を使用して静的メソッドを呼び出し、interfaceを使用してインタフェースを分離し、論理を実装します.
3、静的メソッドを変更できない場合は、protected virtualのメンバーメソッドを追加し、エージェントが静的メソッドを呼び出す方法もあります.テスト時、overrideという方法.
 

いくつかの質問:


クラスのいくつかの方法をテストするにはどうすればいいですか?


いくつかの場合、あるクラスのメソッドをテストします.このメソッドは、このクラスの他のメンバーメソッドを呼び出します.何らかの理由で、これらの依存するメンバーメソッドに対して、mockを出したいかもしれません.

privateメソッドをmockするにはどうすればいいですか?


参照先:
TDD: Mock static method
MoQ Mocks – Use virtual method or interfaces?
How to mock static class or static member for testing