创建在自定义模拟类中返回IDisposable的方法
本文关键字:IDisposable 方法 返回 自定义 模拟类 创建 | 更新日期: 2023-09-27 18:06:22
我试图教育一些人如何使用真正的单元测试,因为他们的大多数自动化测试都是集成测试。
为了做到这一点,我想重构一个类,这样我就可以在没有依赖的情况下独立测试它。
对此我有以下限制:
1. 我不能使用任何mock框架,所以我必须为此创建自定义mock。
2.
那么在我要测试的方法中,我有下面的using语句:
using(myObject.CreateScope())
{
.... do something
}
到目前为止,我计划做的是:
1. 从myObject的类中提取一个接口。2. 使用属性在SUT上注入接口。
当然,"CreateScope"方法将是接口的一部分,定义如下:
public IDisposable CreateScope();
在我的自定义mock中,我想这样做:
public IDisposable CreateScope()
{
return new AnyDisposableObject();
}
我的问题是:
考虑到孤立测试类提供了集成测试无法提供的许多好处的消息,在自定义模拟中实现"CreateScope"方法的最不痛苦和最清晰的方法是什么?
我应该创建一个空的假对象,其唯一目的是实现IDisposable吗?
我应该使用。net框架中实现IDisposable的任何对象吗?
有没有比以上两种选择更好的方法?
提前感谢。
UPDATE:为了清晰起见
using(myObject.CreateScope())
{
var local = parameter.Where(o => !myObject.Contains(o)).Select(o).ToList();
...
myObject.Register(newInstance);
...
return myObject.GetList();
}
我将测试"using"语句中的逻辑。myObject对象将被模拟为在调用返回值的方法或调用空方法时提供值。CreateScope方法所做的是在受保护的字典中放入一个锁,但我对用这个测试该功能不感兴趣。
试试下面这个Mock对象,它实现了IDisposable:
class MockDisposable : IDisposable
{
bool _disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!_disposed) // only dispose once!
{
if (disposing)
{
// Not in destructor, OK to reference other objects
}
// perform cleanup for this object
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
// tell the GC not to finalize
GC.SuppressFinalize(this);
}
~MockDisposable()
{
Dispose(false);
}
}