我发现如果继承它,测试一个类会更容易。 考虑一下这个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
虚拟,然后在测试类中覆盖它 - 但它没有用。
感谢任何帮助。
答案 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)
是私有的。