我正在尝试教育一些人使用真实的单元测试,因为他们的大多数自动化测试都是集成测试。
为此,我想重构一个类,以便我可以在没有依赖项的情况下单独测试它。
为此,我有以下限制:
1. 我不能使用任何模拟框架,所以我必须为此创建自定义模拟。
2. 我无法修改将被模拟的类以将任何私有(private)方法更改为 protected 或公共(public)方法,或将方法更改为虚拟方法,因此我无法继承此类并覆盖这些方法。
所以在我要测试的方法中有以下 using 语句:
using(myObject.CreateScope())
{
.... do something
}
目前我打算做的是:
1. 从myObject的类中提取一个接口(interface)。
2. 使用属性在 SUT 上注入(inject)接口(interface)。
当然,“CreateScope”方法将成为定义如下的接口(interface)的一部分:
public IDisposable CreateScope();
所以在我的自定义模拟中,我想做类似的事情:
public IDisposable CreateScope()
{
return new AnyDisposableObject();
}
我的问题是:
考虑到隔离测试类提供了集成测试无法提供的许多好处的消息,在自定义模拟中实现“CreateScope”方法的最不痛苦和最清晰的方法是什么?
我是否应该创建一个空的假对象,其唯一目的是实现 IDisposable?
我应该使用 .Net 框架中实现 IDisposable 的任何对象吗?
有没有比上述两种方案更好的方法?
提前致谢。
更新:为了清楚起见
using(myObject.CreateScope())
{
var local = parameter.Where(o => !myObject.Contains(o)).Select(o).ToList();
...
myObject.Register(newInstance);
...
return myObject.GetList();
}
我将测试“using”语句中的逻辑。 myObject 对象将被模拟只是为了在调用返回它们的方法或为空方法调用空方法时提供值。 CreateScope 方法的作用是在 protected 字典中加锁,但我不想用它来测试该功能。
希望这能阐明意图。
最佳答案
尝试以下实现 IDisposable 的 Mock 对象:
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);
}
}
关于c# - 在自定义模拟类中创建返回 IDisposable 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7164638/