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

时间:2011-08-23 16:54:56

标签: c# unit-testing

我正在努力教育一些人使用真实单元测试,因为他们的大部分自动化测试都是集成测试。

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

为此,我有以下限制:
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中,但我对此测试该功能并不感兴趣。

希望这澄清了意图。

1 个答案:

答案 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);
    }
}