MoQ(基于.net3.5,c#3.0的mock框架)简单介绍

我们在做单元测试的时候,常常困扰于数据的持久化问题,很多情况下我们不希望单元测试影响到数据库中的内容,而且受数据库的影响有时我们的单元测试的速度会很慢,所以我们往往希望将持久化部分隔离开,做单元测试的时候不真正的将数据持久化。这种隔离我们一般使用抽象的方式,也就是利用接口或抽象类将持久化层隔离开,然后利用mock来模拟相应的接口或抽象类来完成相应的持久化类。MoQ就是这种Mock框架之一,MoQ使用了C#3.0,跟NMock相比MoQ使用起来更简单,而且是强类型的方式的,源码和dll可以到http://code.google.com/p/moq/下载。现在MoQ最新的发布版本是3.1版,4.0还处在beta版中,所以我们这里使用的是3.1版。

下面我们就来介绍一下MoQ的具体用法:

一、基础知识

在使用MoQ之前我们必须要先在测试程序中引入Moq.dll,使用MoQ的主要命名空间是Moq,其中最重的类就是Mock<T>,我们可以用这个类来模拟接口。

1、方法

   public interface ITest
    {
        
string Test();
    }

测试代码:

 

简单测试代码

 

2、匹配参数

 

 public interface IMatchTest
    {
        
string Test(int test);
    }

 

匹配测试

 上边测试代码模拟实现IMathTest接口实例,其中如果Test方法的参数是偶数,其返回值为“偶数”。这里的IT用来过滤参数的类,其具体解释可以参见MoQ的文档

3、属性
 public interface IPropertiesTest
    {
         
int Test { getset; }
    }

 

            var testProperties = new Mock<IPropertiesTest>();
            testProperties.Setup(p 
=> p.Test).Returns(1);
            Assert.AreEqual(
1, testProperties.Object.Test);

或者

var testProperties = new Mock<IPropertiesTest>();
            testProperties.SetupProperty(p 
=> p.Test,1);
            Assert.AreEqual(
1, testProperties.Object.Test);

 

4、Callback

当执行某方法时调用其内部输入的Action委托

 

Callback

 

在调用Test方法是执行了count++

5、Verification

判断某方法或属性是否执行过

如果代码如下:

 

Code

 

会抛出异常,因为第3行执行时Test方法还没有被调用过,改为如下代码可以通过测试

 

Code

其他细节可以查看MoQ文档。

二、应用

先创建一个Account类:

创建一个数据库Provider接口:

 

   public interface ITransferProvider
    {

        
void TransferTo(Account accountFrom, Account accountTo);

    }

 

然后创建转账处理类:

 

TransferProcess

下边我们来测试这个转账处理类:

 

Code

 

三、参考

http://code.google.com/p/moq/wiki/QuickStart

Beginning Mocking With Moq 3 – Part 1

Beginning Mocking With Moq 3 - Part 2

Beginning Mocking With Moq 3 - Part 3

Beginning Mocking With Moq 3 - Part 4

 

posted @ 2009-11-25 18:12  你听海是不是在笑  阅读(14712)  评论(4编辑  收藏  举报