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

标签 c# unit-testing

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

为此,我想重构一个类,以便我可以在没有依赖项的情况下单独测试它。

为此,我有以下限制:
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/

相关文章:

c# - 如何防止一个应用程序的两个实例同时做同样的事情?

javascript - 测试 JS API Lib 的好方法

c# - 重命名项目文件夹而不更改项目名称?

c# - 在 AD 帐户的数据库中存储 SID 或用户名?

c# - 没有强名称的 .NET 程序集是否可以防止意外损坏?

objective-c - 在 UIViewController 中模拟 UIView

c# - 如何对读取 Excel 阅读器进行单元测试?

java - 如何从 NetBeans 运行所有 JUnit 测试用例?

c# - AutoFixture 使用内部 setter 创建属性

c# - Unity3D C# Button Sprite 交换 - 在运行时附加图像