Rhino 模拟如何检查一个方法是否被同一类中的另一个方法调用

本文关键字:方法 调用 另一个 一类 一个 何检查 模拟 检查 Rhino 是否 | 更新日期: 2023-09-27 17:58:12

我在测试我的一个类时遇到了一些麻烦。我有一个抽象类,其中包含一个公共方法和两个受保护的抽象。我需要测试天气公共方法调用一次摘要之一。

下面是我的代码的外观示例:

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()测试使用犀牛嘲笑?

附言我尝试使用ExpectAssertWasCalled但没有成功。

Rhino 模拟如何检查一个方法是否被同一类中的另一个方法调用

你真的需要测试这个吗?单元测试应基于一组输入测试输出。如何实现这一点与测试无关(在输出中,您可以包含对象的结果成员/状态(

例如

,如果我大量重构你的类,我仍然希望测试通过,例如,如果我给你一个输入,我仍然会得到输出。如果实现不同,我真的不希望测试失败(因为我并不真正关心实现(

当您使用 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