这里介绍RhinoMock中的常用的类。
(一)MockRepository
RhinoMock的主要的类,是Mock仓库,用于创建mock对象,录制,重放,验证等。
(1)创建Mock
MockRepository mock = new MockRepository();
(2)创建mock对象
Mock的目的就是创建mock对象,然后期望,录制重放等。创建mock对象有很多方法,以前的版本中通过:
MockRepository fac = new MockRepository();
var customer = fac.CreateMock<ICustomer>();
var customer = fac.CreateMock<ICustomer>();
来进行,CreateMock方法已经过时,工厂方法来进行:
MockRepository fac = new MockRepository();
var customer = fac.StrictMock<ICustomer>();
var customer = fac.StrictMock<ICustomer>();
也可以通过静态工厂方法来创建:
var customer = MockRepository.GenerateMock<ICustomer>();
(3)录制
所有的mock框架都使用Record/Replay模式,但有些是显示的,有些是隐式的,而RhinoMock就是显示的。
·Record/Replay传统的录制与重放:
[Test]
public void TestRR()
{
MockRepository fac = new MockRepository();
var customer = fac.StrictMock<ICustomer>();
customer.Expect(p => p.ShowTitle("")).Return("");
customer.Replay();
Assert.AreEqual("", customer.ShowTitle(""));
}
public void TestRR()
{
MockRepository fac = new MockRepository();
var customer = fac.StrictMock<ICustomer>();
customer.Expect(p => p.ShowTitle("")).Return("");
customer.Replay();
Assert.AreEqual("", customer.ShowTitle(""));
}
·Record,Using方式
public void TestRR()
{
MockRepository fac = new MockRepository();
var customer = fac.StrictMock<ICustomer>();
using (fac.Record())
{
customer.Expect(p => p.ShowTitle("")).Return("");
}
Assert.AreEqual("", customer.ShowTitle(""));
}
{
MockRepository fac = new MockRepository();
var customer = fac.StrictMock<ICustomer>();
using (fac.Record())
{
customer.Expect(p => p.ShowTitle("")).Return("");
}
Assert.AreEqual("", customer.ShowTitle(""));
}
·通过静态工厂方法创建mock对象:
public void TestRR()
{
var customer = MockRepository.GenerateMock<ICustomer>();
customer.Expect(p => p.ShowTitle("")).Return("");
Assert.AreEqual("", customer.ShowTitle(""));
}
{
var customer = MockRepository.GenerateMock<ICustomer>();
customer.Expect(p => p.ShowTitle("")).Return("");
Assert.AreEqual("", customer.ShowTitle(""));
}
(4)验证
用于验证mock对象的期望是否成立。
·Verify,用于验证mock对象的所有期望是否满足
·VerifyAll,用于验证所有mock对象的所有期望是否满足
(二)Expect类
为有返回值的类的方法设置期望
Call:为方法或属性提供期望
·Call<T>(T ignored)
·Call(Action actionToExecute)
例:
[Test]
public void TestCall()
{
MockRepository mock = new MockRepository();
var mockObject = mock.StrictMock<ICustomer>();
Expect.Call(mockObject.ShowTitle(string.Empty)).Return("不能为空");
Expect.Call(mockObject.Unid).Return(30);
mock.ReplayAll();
Assert.AreEqual("不能为空", mockObject.ShowTitle(""));
Assert.AreEqual(30, mockObject.Unid);
}
public void TestCall()
{
MockRepository mock = new MockRepository();
var mockObject = mock.StrictMock<ICustomer>();
Expect.Call(mockObject.ShowTitle(string.Empty)).Return("不能为空");
Expect.Call(mockObject.Unid).Return(30);
mock.ReplayAll();
Assert.AreEqual("不能为空", mockObject.ShowTitle(""));
Assert.AreEqual(30, mockObject.Unid);
}
看lambda表达式方式
[Test]
public void TestCall()
{
MockRepository mock = new MockRepository();
var mockObject = mock.StrictMock<ICustomer>();
mockObject.Expect(p => p.ShowTitle("")).Return("不能为空");
mockObject.Expect(p => p.Unid).Return(30);
mock.ReplayAll();
Assert.AreEqual("不能为空", mockObject.ShowTitle(""));
Assert.AreEqual(30, mockObject.Unid);
}
public void TestCall()
{
MockRepository mock = new MockRepository();
var mockObject = mock.StrictMock<ICustomer>();
mockObject.Expect(p => p.ShowTitle("")).Return("不能为空");
mockObject.Expect(p => p.Unid).Return(30);
mock.ReplayAll();
Assert.AreEqual("不能为空", mockObject.ShowTitle(""));
Assert.AreEqual(30, mockObject.Unid);
}
再来看Using方式
[Test]
public void TestCallUsing()
{
MockRepository mock = new MockRepository();
var mockObject = mock.StrictMock<ICustomer>();
using (mock.Record())
{
mockObject.Expect(p => p.ShowTitle("")).Return("不能为空");
mockObject.Expect(p => p.Unid).Return(30);
}
Assert.AreEqual("不能为空", mockObject.ShowTitle(""));
Assert.AreEqual(30, mockObject.Unid);
}
public void TestCallUsing()
{
MockRepository mock = new MockRepository();
var mockObject = mock.StrictMock<ICustomer>();
using (mock.Record())
{
mockObject.Expect(p => p.ShowTitle("")).Return("不能为空");
mockObject.Expect(p => p.Unid).Return(30);
}
Assert.AreEqual("不能为空", mockObject.ShowTitle(""));
Assert.AreEqual(30, mockObject.Unid);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?