我正在努力教育一些人使用真实单元测试,因为他们的大部分自动化测试都是集成测试。
为了做到这一点,我想重构一个类,这样我就可以在没有依赖的情况下单独测试它。
为此,我有以下限制:
1.我不能使用任何模拟框架,因此我必须为此创建自定义模拟
2.我无法修改将被模拟以将任何私有方法更改为protected或public的类,或者将方法更改为virtual,因此我无法继承此类并覆盖方法。
所以在我要测试的方法中,我有以下using语句:
using(myObject.CreateScope())
{
.... do something
}
到目前为止,我打算做的是:
1.从myObject的类中提取接口
2.使用属性在SUT上注入接口。
当然,“CreateScope”方法将是接口的一部分,其定义如下:
public IDisposable CreateScope();
所以在我的自定义模拟器上,我想做类似的事情:
public IDisposable CreateScope()
{
return new AnyDisposableObject();
}
我的问题是:
考虑到单独测试类的消息提供了集成测试所不具备的许多好处,那么在自定义模拟中实现“CreateScope”方法的最不痛苦和最清晰的方法是什么?
我应该创建一个空虚假对象,其唯一目的是实现IDisposable吗?
我应该使用实现IDisposable的.Net框架中的任何对象吗?
有没有比上面两个选项更好的方法?
提前致谢。
更新:为了清晰起见
using(myObject.CreateScope())
{
var local = parameter.Where(o => !myObject.Contains(o)).Select(o).ToList();
...
myObject.Register(newInstance);
...
return myObject.GetList();
}
我将在“using”语句中测试逻辑。 myObject对象将被模拟,只是为了在调用返回它们的方法时提供值,或者为void属性提供空方法。 CreateScope方法的作用是将锁定置于受保护的Dictionary中,但我对此测试该功能并不感兴趣。
希望这澄清了意图。
答案 0 :(得分:2)
尝试以下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);
}
}