博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
阅读量:6305 次
发布时间:2019-06-22

本文共 1429 字,大约阅读时间需要 4 分钟。

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

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

一、基础知识

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

1、方法

   
public
 
interface
 ITest
    {
        
string
 Test();
    }

测试代码:

 

ContractedBlock.gif
简单测试代码

 

2、匹配参数

 

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

 

ContractedBlock.gif
匹配测试

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

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

 

            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委托

 

ContractedBlock.gif
Callback

 

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

5、

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

如果代码如下:

 

ContractedBlock.gif
Code

 

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

 

ContractedBlock.gif
Code

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

二、应用

先创建一个Account类:

创建一个数据库Provider接口:

 

   
public
 
interface
 ITransferProvider
    {
        
void
 TransferTo(Account accountFrom, Account accountTo);
    }

 

然后创建转账处理类:

 

ContractedBlock.gif
TransferProcess

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

 

ContractedBlock.gif
Code

 

三、参考

 

本文转自 你听海是不是在笑 博客园博客,原文链接:http://www.cnblogs.com/nuaalfm/archive/2009/11/25/1610755.html  ,如需转载请自行联系原作者

你可能感兴趣的文章
BOM:文档对象模型 --树模型
查看>>
我的Android进阶之旅------>WindowManager.LayoutParams介绍
查看>>
segment
查看>>
获取鼠标的原始移动值
查看>>
Linux信号 编程
查看>>
有关滚动与位置
查看>>
Box2D自定义重力
查看>>
chpasswd
查看>>
mysqldump --single-transaction 和--lock-tables参数详解
查看>>
android 数据库_sql语句总结
查看>>
python购物车
查看>>
解决python2和python3的pip冲突
查看>>
面试/编程
查看>>
linux每日命令(16):head命令
查看>>
公司内部分享【富有成效的每日站会】总结
查看>>
打造一个上传图片到图床利器的插件(Mac版 开源)
查看>>
iOS横竖屏
查看>>
thinkphp判断更新是否成功
查看>>
Do While ... Loop 与 Do Until ... Loop 的区别
查看>>
【Linux】查询某个字符串出现次数
查看>>