天天看點

Moq測試基礎說談(四)——Mock類,建立對象,實用工廠

Mock<T> Class

定義為:

public class Mock<T> : Mock

where T : class

這的構造方法:

Mock<T>()

Mock<T>(MockBehavior)

Mock<T>(array<Object>[])

Mock<T>(MockBehavior, array<Object>[])

Mock的泛型實作類,它有很多方法和屬性。這裡一一列舉。

(一)方法

(1)As<TInterface>方法

為mock添加接口實作(mock),可以給它指定設定。

在mock對象的屬性(或方法)首次使用之前才有效。且,參數隻能是接口。

定義:

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("方法調用");

customer.Object.GetCall();

var order=customer.As<IOrder>();

order.Setup(p => p.ShowTitle(It.IsAny<string>())).Returns("ok");

Assert.AreEqual("ok",order.Object.ShowTitle(""));

這個将出現異常,因為在As之前,已經對GetCall進行了調用。

(2)SetUp方法

為模拟的對象中的方法指定設定,它有兩個重載:

Setup(Expression<Action<T>>)

Setup<TResult>(Expression<Func<T,TResult>>)

從兩個委托可以知道,這兩個一個是為沒有傳回值的方法設定,一個是對有傳回值的方法設定

public void TestSetUp()

    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("");

這個前幾篇已經廣泛使用。

(3) 其它方法略

 其它内容可見:

<a href="http://www.cnblogs.com/jams742003/archive/2010/03/02/1676585.html" target="_blank">http://www.cnblogs.com/jams742003/archive/2010/03/02/1676585.html</a>

現在看一下Mock的一個構造器:

Mock&lt;T&gt;(MockBehavior),定義:

public Mock(MockBehavior behavior)

MockBehavior類是自定義mock行為的枚舉:

Strict mock對象沒有合适的設定時,總是抛出異常

Loose 從不抛出異常,如果必要會傳回預設值(引用類型為null,值類型為0,或枚舉和數組為空)

Default mock行為預設值,就是Loose值

接口:

string ShowAddress();

測試:

public void TestBehivor()

    var order = new Mock&lt;IOrder&gt;();

    order.Object.ShowTitle(string.Empty);

這個接口有兩個方法,在測試裡,建立了mock對象,然後調用它的一個方法:ShowTitle

但在之前,這個方法并沒有被設定,這時mock對象的預設行為為Default,也就是Loose,是以不會出現異常。

當把mock對象的行為設定為嚴格後:

var order = new Mock&lt;IOrder&gt;(MockBehavior.Strict);

order.Object.ShowTitle(string.Empty);

測試就會出錯:IOrder.ShowTitle("") invocation failed with mock behavior Strict.

Mock的名字空間中還有一個MockFactory類,是一個用于構造多個mock對象的功能工廠

它有三個方法:

Create,Verify,VerifyAll

Create的方法有:

Create&lt;T&gt;()

Create&lt;T&gt;(MockBehavior)

Create&lt;T&gt;(array&lt;Object&gt;[])

Create&lt;T&gt;(MockBehavior,array&lt;Object&gt;[])

其中Create&lt;T&gt;(array&lt;Object&gt;[])定義:

public Mock&lt;T&gt; Create&lt;T&gt;(

    params Object[] args

) where T : class

它會根據參數來确定合适的被Mock的對象的構造器。

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園

繼續閱讀