创建在自定义模拟类中返回IDisposable的方法

本文关键字:IDisposable 方法 返回 自定义 模拟类 创建 | 更新日期: 2023-09-27 18:06:22

我试图教育一些人如何使用真正的单元测试,因为他们的大多数自动化测试都是集成测试。

为了做到这一点,我想重构一个类,这样我就可以在没有依赖的情况下独立测试它。

对此我有以下限制:
1. 我不能使用任何mock框架,所以我必须为此创建自定义mock。
2.

我不能修改将被模拟的类,将任何私有方法更改为protected或public,或将方法更改为virtual,因此我不能继承该类并覆盖方法。

那么在我要测试的方法中,我有下面的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方法所做的是在受保护的字典中放入一个锁,但我对用这个测试该功能不感兴趣。

创建在自定义模拟类中返回IDisposable的方法

试试下面这个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);
    }
}