【问题标题】:Assert the execution order of private methods断言私有方法的执行顺序
【发布时间】:2019-04-19 21:00:08
【问题描述】:

我想测试一个方法Foo,它调用三个私有方法boo1boo2boo3确实是按照这个确切的顺序调用它们(这是对真实场景的简化)。

为了测试我计划使用Mock 对象的InSequence 方法的序列。

为了测试我计划使用PrivateObject 类的私有方法。

我不知道如何将这两者结合起来;这是我到目前为止所尝试的,但它似乎不起作用!

public class TestedClass
{
    private void _boo1(object someParam)
    {
        //some logic
    }
    private void _boo2(object someParam)
    {
        //some logic
    }
    private void _boo3(object someParam)
    {
        //some logic
    }
    public void Foo(object someParam)
    {
        _boo1(someParam);
        _boo2(someParam);
        _boo3(someParam);
    }
}

这里是我到目前为止创建的测试方法:

[TestMethod]
public void TestSequence()
{
        var sequence = new MockSequence();
        var mockedObject = new Mock<TestedClass>();
        PrivateObject obj = new PrivateObject(mockedObject);
        mockedObject.Object.Foo(It.IsAny<Object>());

        mockedObject.InSequence(sequence).Setup(x => obj.Invoke("_boo1", BindingFlags.Default, It.IsAny<Object>()));
        mockedObject.InSequence(sequence).Setup(x => obj.Invoke("_boo2", BindingFlags.Default, It.IsAny<Object>()));
        mockedObject.InSequence(sequence).Setup(x => obj.Invoke("_boo3", BindingFlags.Default, It.IsAny<Object>()));
}

任何帮助将不胜感激。

【问题讨论】:

  • 看看这个问题。也许它和你的相似:stackoverflow.com/questions/10602264/…
  • 谢谢,但我希望测试私有方法的序列而不是公共方法
  • 私有方法是一个实现细节,应该对类的用户隐藏。测试私有方法会破坏封装。在您的情况下,如果您更改Foo 的实现,您也必须更改您的单元测试,这完全没有意义。
  • 如果你不模拟你的私有方法:是否有一些标准可以让你观察这三个方法是否以正确的顺序被调用?

标签: c# unit-testing reflection mocking


【解决方案1】:

为什么不使用 System.IO 将状态消息写入日志文件?您还可以使用 System.Diagnostics 来获取您当前所在的方法的名称:

string methodName = new StackTrace().GetFrame(0).GetMethod().Name

【讨论】:

  • 但这是一个单元测试!我必须为此更改测试方法?
猜你喜欢
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 2021-01-08
  • 2014-10-15
  • 2015-09-05
  • 1970-01-01
相关资源
最近更新 更多