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();
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();
product.Name = "Laptop Computer";
product.Price = price;
ProductManager.DoublePrice(product);
Assert.AreEqual(price * 2, product.Price);
}
- 对带有返回值方法的mock
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RhinoMockProject
{
public interface IProductRepository
{
IProduct Get(int ProductId);
IEnumerable Select();
bool Save(IProduct product);
}
}
private IEnumerable _fakeProducts = new List
{
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();
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();
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();
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);
}
这篇文章简单地介绍了Rahino mock组件在tdd中的应用,代码下载:http://files.cnblogs.com/jackhuclan/ConsoleApplication6.rar
完整的例子,请参考http://stephenwalther.com/archive/2008/03/23/tdd-introduction-to-rhino-mocks.aspx