.Netで静的メソッドをテストする方法
2890 ワード
ほとんどのMokcフレームワークはmock静的手法をサポートしていないが,静的手法をどのようにテストするか.
次のクラスには、静的メソッドが含まれています.
このクラスは上のHelperクラスの静的メソッドを呼び出します.
.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を出したいかもしれません.
参照先:
TDD: Mock static method
MoQ Mocks – Use virtual method or interfaces?
How to mock static class or static member for testing
次のクラスには、静的メソッドが含まれています.
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