我在测试我的一个课时遇到了一些麻烦。 我有一个抽象类,其中包含一个公共方法和两个受保护的抽象一次。 我需要测试一下天气公共方法调用一次抽象。
以下是我的代码的示例:
public abstract class A
{
public string DoSomething(stirng input)
{
var output = new StringBuilder();
foreach (var currentChar in input)
{
output.Append(DoSomethingElse(currentChar));
}
return output.ToString();
}
protected abstract char DoSomethingElse(char charToChange);
}
public class B : A
{
protected override char DoSomethingElse(char charToChange)
{
var changedChar = charToChange;
// Some logic changing charToChange's value
return changedChar;
}
}
因为DoSomethingElse()
受到保护,我创建了一个发布该方法的类
public class BPublisher : B
{
public virtual new char DoSomethingElse()
{
return base.DoSomethingElse()
}
}
我的问题是如何测试使用DoSomething()
调用DoSomethingElse()
的事实
犀牛嘲笑?
P.S。我尝试过使用Expect
和AssertWasCalled
,但没有成功。
答案 0 :(得分:2)
你真的需要测试一下吗?单元测试应根据一组输入测试输出。如何实现这一点与测试无关(在输出中,您可以包括对象的结果成员/状态)
e.g。如果我重新重构你的课程,我仍然希望测试通过。例如如果我给你一个输入,我仍然得到输出。如果实现不同,我真的不希望测试失败(因为我真的不关心实现)
答案 1 :(得分:1)
当您使用new
声明另一个方法时,它与您原始的受保护方法没有任何关系。因为它不是虚拟的,所以你不能嘲笑它。使它变得虚拟和模拟有点奇怪,因为你派生了一个测试类来创建一个模拟。
在这种情况下,我实际上不会尝试使用模拟。为什么不在属性中返回有用的结果?
public class BPublisher : B
{
public readonly StringBuilder chars = new StringBuilder();
public virtual new char DoSomethingElse(char charToChange)
{
chars.Append(charToChange);
return charToChange;
}
}
var a = new BPublisher();
a.DoSomething("abc");
Assert.AreEqual("abc", a.chars.ToString());
最后还是很奇怪。有时很难测试抽象基类。您也可以考虑公开DoSomethingElse
。