我正在尝试为我们正在开发的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>
答案 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");