MSTest,访问者,继承和私人成员

时间:2010-08-18 00:20:54

标签: unit-testing mstest

我正在尝试为我们正在开发的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的构造函数。

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

1 个答案:

答案 0 :(得分:4)

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

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

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