2016-12-15 58 views
0

我有一个成员从资源文件返回一个字符串,我想单元测试这个,因为有很多,他们可能会被错误地改变。我明白,这是可以实现的反射,但我已经被要求做一个不使用反射的方式。嘲讽受保护的成员,没有反思

成员看起来像这样;

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

据我所知,设置成员返回可以做为;

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

和.verifiable()可以被添加到本月底。但我找不到如何验证字符串正在返回。还是我就在用.verifiable()设置此功能以为,该.returns(“”)值的预期,并呼吁

mock.Verify(); 

将验证该成员已返回正确的字符串或者只是在测试过程中的某个时刻召唤会员?

+0

'Veriffy'只是检查嘲笑的成员实际上被称为。它不会验证被嘲弄的成员是否回到你所设立的。你不想检查模拟工作是否正确(我想这应该由最小起订量确定),但如果它实际上被称为* – HimBromBeere

+0

是的,我认为这不会那么简单,有什么令人难以置信的反对使用继承派生我正在测试从单元测试类的类? –

+0

你想从你的课堂中派生出来模拟其成员之一吗? – HimBromBeere

回答

0

您在这里遇到的问题是您正在尝试测试某些课程以外不可用的内容。测试应该只测试你的类的公共接口,这样只要公共行为保持不变,这个类的内部就可以改变。

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

一是这个代码转移到具有这些属性是公共另一个类,这样,您的测试可以直接调用新的公共属性和检查返回而需要使用该属性值的类可以调用你的新类。继承通常不是共享代码的好方法(博客文章解释这个概念:http://www.blinkingcaret.com/2016/04/13/composition-superior-inheritance/

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

+0

是的,我认为这将是结果。我没有写任何代码,它显然没有被写入测试。我会离开受保护的东西,如果将来有人想要解决他们可以解决的问题! :)感谢您的建议和帮助球员。 –