【问题标题】:Unittest inherit from target (SUT) with Dispose使用 Dispose 从目标 (SUT) 继承单元测试
【发布时间】:2013-02-21 11:13:09
【问题描述】:

我发现如果你继承一个类,测试它会容易得多。 考虑这个伪例子:

  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 对象不会公开任何其他方法,除了应该公开的方法。

这种单元测试方式是不好的做法吗?

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

~Bizz(){Dispose(false);}

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

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

在告诉我它失败之前它甚至不会启动: 单元测试适配器抛出异常:找到不明确的匹配项。

我曾尝试将Dispose 设为虚拟,然后在测试类中覆盖它 - 但它不起作用。

感谢任何帮助。

【问题讨论】:

    标签: c# unit-testing dispose ambiguous


    【解决方案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 存在。

    【讨论】:

    • 这就解释了-谢谢
    【解决方案2】:

    失败的原因对我来说仍然是个谜。但这似乎解决了:

    void IDisposable.Dispose()
    {
      GC.SuppressFinalize(this);
      Dispose(true);
    }
    
    private void Dispose(bool disposing)
    {
       //actual cleanup omitted
    }
    

    请注意,接口现在已显式实现 + 实际的清理方法 Dispose(bool disposing) 已设为私有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多