Moqテスト基礎説(二)——Mock方法、方法パラメータ

4966 ワード

準備:
public interface ICustomer
{ }

(一)方法
(1)一般的な方法
インタフェースに3つのメソッドを追加します.
void AddCall();
string GetCall();
string GetCall(string strUser);

Mockテスト:
var customer = new Mock<ICustomer>();
customer.Setup(p=>p.AddCall());
customer.Setup(p => p.GetCall()).Returns("phone:89898789");
customer.Setup(p => p.GetCall("Tom")).Returns("Hello");
customer.Object.AddCall();
Assert.AreEqual("phone:89898789", customer.Object.GetCall());
Assert.AreEqual("Hello", customer.Object.GetCall("Tom"));

まず、Icustomerインタフェースのmockオブジェクト:customerを確立し、このオブジェクトはIcustomerインタフェースのビジネスを実行します.
次に、インタフェースの3つのメソッドに依存して追加します.
3つ目の方法は
customer.Setup(p => p.GetCall("Tom")).Returns("Hello");
CustomerオブジェクトのGetCallメソッドで、パラメータTomを渡し、戻り値:Hello、相当:
string GetCall(“Tom”){return “Hello”;}
テスト、パラメータなしGetCall()を呼び出すと、phone:89898789が返されることがわかりました.
パラメータのあるGetCall(string)を呼び出すと、パラメータが「Tom」の場合、「Hello」を返します.
(2)参照または出力パラメータを持つ方法
string GetAddress(string strUser, out string Address);
string GetFamilyCall(ref string strUser);
var customer = new Mock<ICustomer>();
var outString="oo";
customer.Setup(p => p.GetAddress("", out outString)).Returns("shijiazhuang");
customer.Setup(p => p.GetFamilyCall(ref outString)).Returns("xx");

(3)戻り値がある一般的な方法
string GetCall(string strUser)も使用します.
これはテストを行います.ここではパラメータを操作できます.
var customer = new Mock<ICustomer>();
customer.Setup(p => p.GetCall(It.IsAny<string>()))
.Returns((string s) => "Hello "+s);
Assert.AreEqual("Hello Tom",customer.Object.GetCall("Tom"));

GetCallメソッドの戻り値は、Hello+呼び出しパラメータです.
(4)メソッド呼び出し時に例外を投げ出す
方法:void ShowException(string str);
テスト:
var customer = new Mock<ICustomer>();
customer.Setup(p => p.ShowException(string.Empty))
.Throws(new Exception(" !"));
customer.Object.ShowException("");

入力されたパラメータがNULL(string.Empty)の場合、このメソッドを呼び出すと(Mock呼び出し)異常がトリガーされます. 
(5)呼び出し時付与
方法:void AddCall()
Mockテスト:
var customer = new Mock<ICustomer>();
int iCount = 0;
customer.Setup(p => p.AddCall()).Callback(()=>iCount++);
Assert.AreEqual(0, iCount);
customer.Object.AddCall();
Assert.AreEqual(1, iCount);
customer.Object.AddCall();
Assert.AreEqual(2, iCount);
customer.Object.AddCall();
Assert.AreEqual(3, iCount);

(二)マッチングパラメータ
var customer = new Mock<ICustomer>();
customer.Setup(p => p.SelfMatch(It.IsAny<int>()))
.Returns((int k) => " :" + k);
Console.WriteLine(customer.Object.SelfMatch(100));
customer.Setup(p => p.SelfMatch(It.Is<int>(i => i % 2 == 0)))
.Returns(" ");
Console.WriteLine(customer.Object.SelfMatch(100));
customer.Setup(p => p.SelfMatch(It.IsInRange<int>(0, 10, Range.Inclusive)))
.Returns("10 ");
Console.WriteLine(customer.Object.SelfMatch(8));
customer.Setup(p => p.ShowException(It.IsRegex(@"^\d+$")))
.Throws(new Exception(" "));
customer.Object.ShowException("r4");

Itはパラメータ制約を追加するために使用され、以下の方法があります.
Is:指定されたタイプに一致
IsAny:指定した値に一致
IsInRange:指定されたタイプの範囲に一致
IsRegex:正則マッチング
例を示します.
(1)Is
customer.Setup(x => x.SelfMatch(It.Is(i => i % 2 == 0))).Returns("1");
メソッドSelfMatchはint型パラメータを受け入れ,パラメータが偶数の場合に文字列1を返す.
i=>i%2=0という表現の意味は以前のエッセイで説明されていますが、詳しくは以下の通りです.
http://www.cnblogs.com/jams742003/archive/2009/12/23/1630737.html
(2)IsAny
customer.Setup(p => p.SelfMatch(It.IsAny())).Returns((int k)=>「任意の数:」+k);
メソッドSelfMatchはint型を受け入れ、任意のint型パラメータを受け入れ、「任意の数:」+kを返します.
ここでReturnsメソッドについて説明します.
 
Returns(Func)
Returns(Func)
Returns(Func)
Returns(Func)
Returns(Func)
Returns(TResult)
 
この例では、最初のリロードを使用します.Func依頼については、私に会えます.
http://www.cnblogs.com/jams742003/archive/2009/10/31/1593393.html
Funcは最大4個の入力パラメータ(5個のリロードがある)を受け入れるため,ここでのReturnsはFunc依頼パラメータ付きのリロードも5個ある.
(3)IsInRange
customer.Setup(p => p.SelfMatch(It.IsInRange(0, 10, Range.Inclusive)))
.Returns(「10以内の数」);
メソッドSelfMatchはint型を受け入れ、範囲が[0,10]の場合、10以内の数を返します.
この方法には、除外スイッチが含まれています.
(4)IsRegex
customer.Setup(p => p.ShowException(It.IsRegex(@"^\d+$")))
.Throws(new Exception(「数字ではない」)