【问题标题】:Mocking a protected member without reflection在不反射的情况下模拟受保护的成员
【发布时间】:2016-12-15 18:43:32
【问题描述】:

我有一个从资源文件返回字符串的成员,我想对此进行单元测试,因为有很多并且可能会被错误地更改。我知道这可以使用反射来实现,但我被要求以不使用反射的方式来实现。

成员看起来像这样;

protected override string StringOne
    {
        get
        {
            return Resources.String;
        }
    }

我了解为会员设置退货可以这样做:

 mock.Protected()
            .Setup<string>("StringOne")
            .Returns("Returned string.");

和 .verifiable() 可以添加到此末尾。但我找不到如何验证正在返回的字符串。还是我认为通过使用 .verifiable() 进行设置,.returns("") 值是预期的,并调用

mock.Verify();

将验证成员是否返回了正确的字符串,或者只是验证成员在测试期间的某个时间点被调用?

【问题讨论】:

  • Veriffy 只是检查被模拟的成员是否被实际调用。它不会验证被模拟的成员是否返回您设置的内容。您不想检查模拟是否正常工作(我想这应该由最小起订量来确保),但如果它实际上是 调用
  • 是的,我认为它不会那么简单,有什么令人难以置信的反对使用继承从单元测试类派生我正在测试的类?
  • 您想从您的类派生来测试以模拟其成员之一?
  • 只需对测试的预期和实际结果进行断言。
  • 记录一下,仅仅因为你没有直接使用反射并不意味着被调用的框架没有使用反射。如果您查看Moq.Protected 的源代码,您会发现该框架实际上是在后台使用反射。

标签: c# unit-testing moq


【解决方案1】:

您在这里遇到的问题是,您正在尝试测试课堂外无法获得的东西。测试应该只测试你的类的公共接口,这样只要公共行为保持不变,类的内部就可以改变。

在这种情况下,我认为您有两个选择:

一个是将这些代码移到另一个类中,这些属性是公共的,这样您的测试就可以调用新的公共属性并检查返回,需要使用该属性值的类可以调用您的新类.无论如何,继承通常不是共享代码的好方法(解释此概念的博客文章:http://www.blinkingcaret.com/2016/04/13/composition-superior-inheritance/

另一个是测试这些属性最终在哪里使用。例如,如果你有一些方法将StringOne 的值传递给另一个模拟类,你可以检查是否传递了正确的值,或者如果它最终被用于文件路径,你应该测试文件路径最终是正确的等等

【讨论】:

  • 是的,我认为这将是结果。我没有编写任何代码,而且显然不是为了测试而编写的。我会留下受保护的东西,如果将来有人想解决这个问题,他们可以! :) 感谢您的建议和帮助。
猜你喜欢
  • 1970-01-01
  • 2012-06-13
  • 2011-07-18
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 2012-07-05
相关资源
最近更新 更多