使用Rhino Mocks
Rhino Mocks是TDD(测试驱动开发)中一个非常重要的组件,这篇文章简单地介绍下这个组件mock的使用。创建2个项目,
- 对抽象类的mock
添加ProductBase类
using System;
namespace RhinoMockProject
{
public abstract class ProductBase
{
public abstract string Name { get; set; }
public abstract decimal Price { get; set; }
public abstract void Save();
}
}
[TestMethod]
public void TestStubAbstract()
{
ProductBase product = MockRepository.GenerateStub<ProductBase>();
product.Name = "Laptop Computer";
product.Price = 3200.00m;
Assert.AreEqual(3200.00m, product.Price);
}
- 对接口的mock
public interface IProduct
{
string Name { get; set; }
decimal Price { get; set; }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RhinoMockProject
{
public class ProductManager
{
public static void DoublePrice(IProduct product)
{
product.Price *= 2;
}
}
}
[TestMethod]
public void TestStubInterface()
{
decimal price = 3200.00m;
IProduct product = MockRepository.GenerateStub<IProduct>();
product.Name = "Laptop Computer";
product.Price = price;
ProductManager.DoublePrice(product);
Assert.AreEqual(price * 2, product.Price);
}
- 对带有返回值方法的mock,注意对有返回值的对象进行mock,MockRepository必须实例化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RhinoMockProject
{
public interface IProductRepository
{
IProduct Get(int ProductId);
IEnumerable<IProduct> Select();
bool Save(IProduct product);
}
}
private IEnumerable<IProduct> _fakeProducts = new List<IProduct>
{
new Product {Name = "Steak", Price = 9.85m},
new Product {Name = "Milk", Price = 2.02m},
new Product {Name = "Diapers", Price = 33.07m}
};
[TestMethod]
public void TestStubInterfaceMethod()
{
MockRepository mocks = new MockRepository();
IProductRepository products = mocks.Stub<IProductRepository>();
using (mocks.Record())
{
SetupResult.For(products.Select()).Return(_fakeProducts);
}
var results = products.Select();
Assert.AreEqual(3, results.Count());
}
mock多个返回值
[TestMethod]
public void TestStubMultipleReturn()
{
MockRepository mocks = new MockRepository();
IProductRepository products = mocks.Stub<IProductRepository>();
using (mocks.Record())
{
SetupResult
.For(products.Get(2))
.Return(new Product { Name = "Beer", Price = 12.99m });
SetupResult
.For(products.Get(12))
.Return(new Product { Name = "Steak", Price = 8.02m });
}
// Test
IProduct product1 = products.Get(2);
Assert.AreEqual("Beer", product1.Name);
IProduct product2 = products.Get(12);
Assert.AreEqual("Steak", product2.Name);
IProduct product3 = products.Get(13);
Assert.IsNull(product3);
}
[TestMethod]
public void TestStubIgnoreArguments()
{
MockRepository mocks = new MockRepository();
IProductRepository products = mocks.Stub<IProductRepository>();
using (mocks.Record())
{
SetupResult
.For(products.Get(1))
.IgnoreArguments()
.Return(new Product { Name = "Beer", Price = 12.99m });
}
// Test
IProduct product1 = products.Get(2);
Assert.AreEqual("Beer", product1.Name);
IProduct product2 = products.Get(12);
Assert.AreEqual("Beer", product2.Name);
}
完整的例子,请参考http://stephenwalther.com/archive/2008/03/23/tdd-introduction-to-rhino-mocks.aspx
作者:Jackhuclan
出处:http://jackhuclan.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://jackhuclan.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。