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