0

我发现如果你继承一个类,测试一个类要容易得多。考虑这个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 对象不会公开任何其他方法,除了应该公开的方法。

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

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

~Bizz(){Dispose(false);}

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

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

在向我显示它失败之前它甚至不会启动: 单元测试适配器抛出异常:找到模糊匹配。

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

任何帮助表示赞赏。

4

2 回答 2

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.

于 2014-07-09T09:14:22.953 回答
0

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

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

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

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

于 2013-02-21T14:03:53.617 回答