【问题标题】:MSTest, Accessors, Inheritance, and Private MembersMSTest、访问器、继承和私有成员
【发布时间】:2010-08-18 00:20:54
【问题描述】:

我正在尝试为我们正在开发的 MVC 应用程序编写一些测试。我们有一个 BaseController 类,它包含以下内容:

public class BaseController : Controller
{
    protected string UserRole { get; private set; }

然后我们有一个继承自 BaseController 的控制器:

public class CustomFieldController : BaseController

我已经为这两个类生成了私有访问器(几分钟前刚刚重新生成了它们)。在我对 CustomFieldController 的单元测试之一中,我想设置 UserRole,所以我得到了以下代码:

CustomFieldController controller = new CustomFieldController();
CustomFieldController_Accessor accessor = new CustomFieldController_Accessor( 
    new PrivateObject( controller, new PrivateType( typeof( BaseController ) ) ) );

accessor.UserRole = "OTHER";

每次我尝试运行此测试时,它都会在最后一行抛出异常:

找不到指定的成员 (CustomFieldEdit)。您可能需要重新生成私有访问器,或者该成员可能是私有的并在基类上定义。如果后者为真,则需要将定义成员的类型传递给 PrivateObject 的构造函数。

据我所知,我已经做到了。我不仅最近重新生成了私有访问器,而且还将定义成员的类型传递给 PrivateObject 的构造函数。

关于我在这里缺少什么有什么想法吗?我知道我可以通过从属性设置器中删除“私有”来使其工作,但如果我可以避免它,我宁愿不这样做(不希望子类实现者认为他们可以将值注入该属性)。

【问题讨论】:

  • 只是不要使用这些私有访问器的东西——它只会让你编写垃圾代码。你应该只对你的类的公共接口进行单元测试。
  • 也许我的帖子不清楚。我不是在尝试测试该属性(那将是非常愚蠢的)。为了测试几个方法的所有代码路径,该属性需要在其中包含一个值。我也不同意只测试公共接口。私有方法通常构成公共接口的基础,并且能够测试那些较小的工作单元以确保它们都正确地做他们的事情在我看来与单元测试的全部内容是正确的。

标签: unit-testing mstest


【解决方案1】:

CustomFieldController controller = new CustomFieldController();
var po = new PrivateObject( controller, new PrivateType( typeof( BaseController ) ) );
CustomFieldController_Accessor accessor = new CustomFieldController_Accessor( po );

po.SetFieldOrProperty("UserRole","OTHER");

【讨论】:

  • 虽然这确实解决了问题并且我理解它为什么解决了它(需要添加 PrivateType 以便访问者知道在执行时要在哪个对象中查找成员),但我可以建议添加一个简短的解释至于为什么在未来用户的答案中?
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2015-01-21
  • 1970-01-01
  • 2020-09-01
相关资源
最近更新 更多