繁体   English   中英

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

[英]Rhino mocks how to check if a method was called by another method from the same class

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

下面是我的代码如何显示的示例:

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()
    }
}

我的问题是如何使用Rhino模拟测试DoSomething()调用DoSomethingElse()的事实?

PS我尝试过使用ExpectAssertWasCalled但没有成功。

你真的需要测试一下吗? 单元测试应根据一组输入测试输出 如何实现这一点与测试无关(在输出中你可以包括结果成员/对象的状态)

例如,如果我重新重构你的课程,我仍然希望测试通过。 例如,如果我给你一个输入,我仍然得到输出。 如果实现不同,我真的不希望测试失败(因为我真的不关心实现)

当您使用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公之于众。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM