【转】漫谈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/

这里有一些文档说明。

 

可以模拟接口和存在的类。在模拟类时有一些限制。类不能是密封的。方法要加上虚修饰符。不能模拟静态方法(可以通过适配器模式来模拟静态方法)。

下边是一个小例子

准备工作:

[csharp] view plain copy
print?
  1. public interface ITaxCalculator  
  2. {  
  3. decimal GetTax(decimal rawPrice);  
  4. }  
  5.    
  6. public class Product  
  7. {  
  8. public int ID { getset; }  
  9. public String Name { getset; }  
  10. public decimal RawPrice { getset; }  
  11.    
  12. public decimal GetPriceWithTax(ITaxCalculator calculator)  
  13. {  
  14. return calculator.GetTax(RawPrice) + RawPrice;  
  15. }  
  16. }  
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;}}


测试

[csharp] view plain copy
print?
  1. public void TestTax()  
  2. {  
  3.     Product myProduct = new Product { ID = 1, Name = “TV”, RawPrice = 25.0M };  
  4.     Mock<ITaxCalculator> fakeTaxCalculator = new Mock<ITaxCalculator>();  
  5.     fakeTaxCalculator.Setup(tax => tax.GetTax(25.0M)).Returns(5.0M);  
  6.    
  7.     decimal calculatedTax = myProduct.GetPriceWithTax(fakeTaxCalculator.Object);  
  8.     fakeTaxCalculator.Verify(tax => tax.GetTax(25.0M));  
  9.    
  10.     Assert.AreEqual(calculatedTax, 30.0M);   
  11. }  
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); }
 

其中:

[csharp] view plain copy
print?
  1. Mock<ITaxCalculator> fakeTaxCalculator = new Mock<ITaxCalculator>();  
  2. 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

原创粉丝点击