Unittest使用Dispose继承目标(SUT)

时间:2013-02-21 11:13:10

标签: c# unit-testing dispose ambiguous

我发现如果继承它,测试一个类会更容易。 考虑一下这个seudo例子:

  public class Bizz
  {
    public void Do()
    {
      var obj = ExtenOutOfTest();
      someList.Add(obj);
    }

    protected List<ISomeObejct> someList = new ISomeObejct<ISomeObejct>();

    protected virtual ISomeObejct ExtenOutOfTest()
    {
     //return real obejct 
    }
  }

,测试看起来像这样:

  [TestClass]
  public class BizzTest : Bizz
  {
    private ISomeObejct _fakedObj;

    protected override ISomeObejct ExtenOutOfTest()
    {
      return _fakedObj;
    }

    [TestMethod]
    public void Test_Do_Add()
    {
      _fakedObj = new Fake<ISomeObejct>().FakedObject; 

      Assert.IsFalse(someList.Any());
      base.Do(); //<-- target
      Assert.IsTrue(someList.Any());
    }
  }

现在我有能力隔离我的测试,我的Bizz对象dosn暴露除了应该的那些之外的任何其他方法。

这种单位测试是不是很糟糕?

当我修改我的Bizz类以实现IDisposable时,我无法再运行我的测试:

~Bizz(){Dispose(false);}

public void Dispose()
{
  Dispose(true);
}

private void Dispose(bool disposing)
{
  if(!disposing) return;
  //do cleanup resources
}

在向我展示它失败之前,它甚至没有开始: 单元测试适配器引发异常:找到了模糊匹配。

我试图让Dispose虚拟,然后在测试类中覆盖它 - 但它没有用。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

使用所述的标准配置模式,例如在http://msdn.microsoft.com/en-us/library/fs2xkftw(v=vs.100).aspx中修复问题。也就是说,将private void Dispose(bool disposing)...替换为protected void Dispose(bool disposing)...

问题与MSTest(我测试过Visual Studio 2010和2013)在每次测试后都在测试类上调用dispose这一事实有关。为此,MSTest查询所有public void Dispose函数,但遗憾的是忽略了参数,该参数是区分两个变体的函数签名的一部分。因此,MSTest存在Ambiguous match found

答案 1 :(得分:0)

故事的原因对我来说仍然是一个谜。但这似乎已经解决了:

void IDisposable.Dispose()
{
  GC.SuppressFinalize(this);
  Dispose(true);
}

private void Dispose(bool disposing)
{
   //actual cleanup omitted
}

请注意,接口现在已明确实现+实际清理方法Dispose(bool disposing)是私有的。