Mock<T> Class
定義為:
public class Mock<T> : Mock
where T : class
這的構(gòu)造方法:
Mock<T>()
Mock<T>(MockBehavior)
Mock<T>(array<Object>[])
Mock<T>(MockBehavior, array<Object>[])
Mock的泛型實現(xiàn)類父阻,它有很多方法和屬性。這里一一列舉望抽。
(一)方法
(1)As<TInterface>方法
為mock添加接口實現(xiàn)(mock)加矛,可以給它指定設(shè)置。
在mock對象的屬性(或方法)首次使用之前才有效糠聪。且荒椭,參數(shù)只能是接口谐鼎。
定義:
public virtual Mock<TInterface> As<TInterface>()
where TInterface : class
示例:
兩個接口:
其中的Icustomer接口還是前幾篇中用到的舰蟆,這里添加一個Iorder接口:
public interface IOrder
{
string ShowTitle(string str);
}
Mock測試:
var customer = new Mock<ICustomer>();
customer.Setup(p => p.GetCall()).Returns("方法調(diào)用");
customer.Object.GetCall();
var order=customer.As<IOrder>();
order.Setup(p => p.ShowTitle(It.IsAny<string>())).Returns("ok");
Assert.AreEqual("ok",order.Object.ShowTitle(""));
這個將出現(xiàn)異常,因為在As之前狸棍,已經(jīng)對GetCall進行了調(diào)用身害。
(2)SetUp方法
為模擬的對象中的方法指定設(shè)置,它有兩個重載:
Setup(Expression<Action<T>>)
Setup<TResult>(Expression<Func<T,TResult>>)
從兩個委托可以知道草戈,這兩個一個是為沒有返回值的方法設(shè)置塌鸯,一個是對有返回值的方法設(shè)置
public void TestSetUp()
{
var customer = new Mock<ICustomer>();
customer.Setup(p => p.AddCall())
.Callback(()=>Console.WriteLine("沒有返回值"));
customer.Setup(p => p.GetCall(It.IsAny<string>()))
.Returns("ok")
.Callback((string q) => Console.WriteLine("有返回值"));
customer.Object.AddCall();
customer.Object.GetCall("");
}
這個前幾篇已經(jīng)廣泛使用。
(3) 其它方法略
其它內(nèi)容可見:
http://www.cnblogs.com/jams742003/archive/2010/03/02/1676585.html
現(xiàn)在看一下Mock的一個構(gòu)造器:
Mock<T>(MockBehavior)唐片,定義:
public Mock(MockBehavior behavior)
MockBehavior類是自定義mock行為的枚舉:
Strict mock對象沒有合適的設(shè)置時丙猬,總是拋出異常
Loose 從不拋出異常,如果必要會返回默認值(引用類型為null,值類型為0,或枚舉和數(shù)組為空)
Default mock行為默認值,就是Loose值
接口:
public interface IOrder
{
string ShowTitle(string str);
string ShowAddress();
}
測試:
public void TestBehivor()
{
var order = new Mock<IOrder>();
order.Object.ShowTitle(string.Empty);
}
這個接口有兩個方法盅粪,在測試里嗓袱,創(chuàng)建了mock對象,然后調(diào)用它的一個方法:ShowTitle
但在之前劳殖,這個方法并沒有被設(shè)置毁靶,這時mock對象的默認行為為Default辜限,也就是Loose揪垄,所以不會出現(xiàn)異常穷吮。
當把mock對象的行為設(shè)置為嚴格后:
var order = new Mock<IOrder>(MockBehavior.Strict);
order.Object.ShowTitle(string.Empty);
測試就會出錯:IOrder.ShowTitle("") invocation failed with mock behavior Strict.
Mock的名字空間中還有一個MockFactory類,是一個用于構(gòu)造多個mock對象的功能工廠
它有三個方法:
Create饥努,Verify捡鱼,VerifyAll
Create的方法有:
Create<T>()
Create<T>(MockBehavior)
Create<T>(array<Object>[])
Create<T>(MockBehavior,array<Object>[])
其中Create<T>(array<Object>[])定義:
public Mock<T> Create<T>(
params Object[] args
) where T : class
它會根據(jù)參數(shù)來確定合適的被Mock的對象的構(gòu)造器。