【转】漫谈Moq(一)
来源:互联网 发布:在ubuntu上下载软件 编辑:程序博客网 时间:2024/05/21 10:16
Moq,就是Mock you。读音可以读成Mock~you。是Mock框架的一种。用于测试中的Mock测试。Mock是模拟的意思。Mock是模拟对象的一种技术。
它可以用于以下情况(引用):
—– 真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情)
—– 真实对象很难被创建(比如具体的web容器)
—– 真实对象的某些行为很难触发(比如网络错误)
—– 真实情况令程序的运行速度很慢
—– 真实对象有用户界面
—– 测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)
—– 真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题)
举个明了的例子:在开发一套BS网店系统时,想集中精力开发业务逻辑部分,而不想在数据层上花费太多时间,这时,可以通过Mock对象来模拟数据层,而不必去为数据连接,CRUD,Mapping等等去做太多的事,而又可以使业务测试可以进行下去。
下载地址:
http://code.google.com/p/moq/
这里有一些文档说明。
可以模拟接口和存在的类。在模拟类时有一些限制。类不能是密封的。方法要加上虚修饰符。不能模拟静态方法(可以通过适配器模式来模拟静态方法)。
下边是一个小例子
准备工作:
- public interface ITaxCalculator
- {
- decimal GetTax(decimal rawPrice);
- }
- public class Product
- {
- public int ID { get; set; }
- public String Name { get; set; }
- public decimal RawPrice { get; set; }
- public decimal GetPriceWithTax(ITaxCalculator calculator)
- {
- return calculator.GetTax(RawPrice) + RawPrice;
- }
- }
public interface ITaxCalculator{decimal GetTax(decimal rawPrice);}public class Product{public int ID { get; set; }public String Name { get; set; }public decimal RawPrice { get; set; }public decimal GetPriceWithTax(ITaxCalculator calculator){return calculator.GetTax(RawPrice) + RawPrice;}}
测试
- public void TestTax()
- {
- Product myProduct = new Product { ID = 1, Name = “TV”, RawPrice = 25.0M };
- Mock<ITaxCalculator> fakeTaxCalculator = new Mock<ITaxCalculator>();
- fakeTaxCalculator.Setup(tax => tax.GetTax(25.0M)).Returns(5.0M);
- decimal calculatedTax = myProduct.GetPriceWithTax(fakeTaxCalculator.Object);
- fakeTaxCalculator.Verify(tax => tax.GetTax(25.0M));
- Assert.AreEqual(calculatedTax, 30.0M);
- }
public void TestTax(){ Product myProduct = new Product { ID = 1, Name = "TV", RawPrice = 25.0M }; Mock<ITaxCalculator> fakeTaxCalculator = new Mock<ITaxCalculator>(); fakeTaxCalculator.Setup(tax => tax.GetTax(25.0M)).Returns(5.0M); decimal calculatedTax = myProduct.GetPriceWithTax(fakeTaxCalculator.Object); fakeTaxCalculator.Verify(tax => tax.GetTax(25.0M)); Assert.AreEqual(calculatedTax, 30.0M); }
其中:
- Mock<ITaxCalculator> fakeTaxCalculator = new Mock<ITaxCalculator>();
- fakeTaxCalculator.Setup(tax => tax.GetTax(25.0M)).Returns(5.0M);
Mock<ITaxCalculator> fakeTaxCalculator = new Mock<ITaxCalculator>();fakeTaxCalculator.Setup(tax => tax.GetTax(25.0M)).Returns(5.0M);
这部分就是建立Mock对象。
这里其实对GetTax方法进行了模拟:
GetTax(25.0M){return 5.0M;}
当调用myProduct.GetPriceWithTax(fakeTaxCalculator.Object)时,那么,
return calculator.GetTax(RawPrice) + RawPrice;
现在calculator对象已经进行了模拟,GetPriceWithTax返回GetTax的值+RawPrice的值。
此时的Product的RawPrice的值为25.0M,从这个值可以得到tax.GetTax(25.0M)的值是5.0M。而25.0M+5.0M的值是30.0M。所以返回的值是30.0M。这个断言是正确的。
原文地址:
http://www.cnblogs.com/jams742003/archive/2010/03/02/1676215.html
- 【转】漫谈Moq(一)
- 【转】漫谈Moq(二)
- 【转】漫谈Moq(三)
- 【转】漫谈Moq(四)
- Nginx 变量漫谈(一)(转)
- lucene 漫谈(一)
- 漫谈-----泛型(一)
- 漫谈嵌入式(一)
- 递归漫谈(一)
- Moq测试基础说谈(一)——简介,下载
- Java学习方法漫谈(一)
- 漫谈LCD调试(一)
- 漫谈反射机制(一)
- Nginx 变量漫谈(一)
- 【Windows】线程漫谈(一)
- 视觉SLAM漫谈(一)
- 视觉SLAM漫谈(一)
- 数据可视化漫谈(一)
- c语言之函数(一)
- 个人总结TP框架小结
- 杭电1242
- bzoj3357[Usaco2004]等差数列 DP
- 这几天看的一篇文章很有感触的文章
- 【转】漫谈Moq(一)
- 关于函数的重载、覆盖和重写(Overload、Overwrite、Override)
- 帧同步相关笔记
- iOS 多线程在项目中的应用场景(一)
- leetcode 378. Kth Smallest Element in a Sorted Matrix
- 解决 element ui 弹出组件的遮罩层在弹出层的上面的问题
- POSIX信号处理
- 素数环
- dojo.declare/dojo.provide/dojo.require:JavaScript模块化管理工具