【发布时间】: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