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()
{
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("");
}
这个前几篇已经广泛使用。
(3) 其它方法略
其它内容可见:
http://www.cnblogs.com/jams742003/archive/2010/03/02/1676585.html
现在看一下Mock的一个构造器:
Mock<T>(MockBehavior),定义:
public Mock(MockBehavior behavior)
MockBehavior类是自定义mock行为的枚举:
Strict mock对象没有合适的设置时,总是抛出异常
Loose 从不抛出异常,如果必要会返回默认值(引用类型为null,值类型为0,或枚举和数组为空)
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);
}
这个接口有两个方法,在测试里,创建了mock对象,然后调用它的一个方法:ShowTitle
但在之前,这个方法并没有被设置,这时mock对象的默认行为为Default,也就是Loose,所以不会出现异常。
当把mock对象的行为设置为严格后:
var order = new Mock<IOrder>(MockBehavior.Strict);
order.Object.ShowTitle(string.Empty);
测试就会出错:IOrder.ShowTitle("") invocation failed with mock behavior Strict.
Mock的名字空间中还有一个MockFactory类,是一个用于构造多个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
它会根据参数来确定合适的被Mock的对象的构造器。