Unit testing MSTest、访问器、继承和私有成员

Unit testing MSTest、访问器、继承和私有成员,unit-testing,mstest,Unit Testing,Mstest,我正试图为我们正在开发的MVC应用程序编写一些测试。我们有一个BaseController类,它包含以下内容: public class BaseController : Controller { protected string UserRole { get; private set; } 然后我们有一个从BaseController继承的控制器: public class CustomFieldController : BaseController 我已经为这两个类生成了私有访问

我正试图为我们正在开发的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)。您可能需要重新生成私有访问器,或者该成员可能是私有的并在基类上定义。如果后者为true,则需要将定义成员的类型传递到PrivateObject的构造函数中

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

你有没有想过我在这里遗漏了什么?我知道我可以通过去掉属性setter中的“private”来实现它,但如果可以避免的话,我宁愿不这样做(不希望子类实现者认为他们可以向该属性中注入值)。


CustomFieldController=新的CustomFieldController()
var po=新的PrivateObject(控制器,新的PrivateType(typeof(BaseController))
CustomFieldController_访问器访问器=新CustomFieldController_访问器(po)


CustomFieldController=新的CustomFieldController()
var po=新的PrivateObject(控制器,新的PrivateType(typeof(BaseController))
CustomFieldController_访问器访问器=新CustomFieldController_访问器(po)


只是不要使用这些私有访问器——它只会让你写垃圾代码。你应该只对你的类的公共接口进行单元测试。也许我的帖子不清楚。我不想测试属性(那将是相当愚蠢的)。为了测试属性中需要有值的两个方法的所有代码路径。我也不同意只测试公共接口。私有方法通常构成公共接口的基础,并且能够测试那些较小的工作单元,以确保它们都能正确地完成它们的操作,在我看来,这与单元测试是完全一致的。只是不要使用这些私有访问器的东西——它只会让您编写垃圾代码。你应该只对你的类的公共接口进行单元测试。也许我的帖子不清楚。我不想测试属性(那将是相当愚蠢的)。为了测试属性中需要有值的两个方法的所有代码路径。我也不同意只测试公共接口。私有方法通常构成公共接口的基础,并且能够测试那些较小的工作单元,以确保它们都能正确地完成它们的操作,在我看来,这与单元测试的正确性是一致的。虽然这确实解决了问题,但我理解它为什么固定它。(需要添加PrivateType,以便访问者知道在执行时在哪个对象中查找成员),我是否可以建议在回答中为未来用户添加一个简短的解释,说明原因?尽管这确实解决了问题,我也理解它为什么解决了问题(需要添加PrivateType,以便访问器知道在执行时在哪个对象中查找成员),我是否可以建议在回答中为未来用户添加一个简短的解释?
po.SetFieldOrProperty("UserRole","OTHER");