如何测试一个受保护的方法?

3
我有一个ASP.NET页面,它是许多其他派生页面的基础,并且包含以下受保护的方法。
protected Change SetupApproval(string changeDescription)
{
    Change change = Change.GetInstance();
    change.Description = changeDescription;
    change.DateOfChange = DateTime.Now;
    change.MadeBy = Common.ActiveDirectory.GetUsersFullName(AccessCheck.CurrentUser());
    change.Page = PageName;
    return change;
}

我想编写以下单元测试

[TestMethod]
public void SetupApproval_SubmitChange_ValidateDescription()
{
    var page = new DerivedFromBaseClass();
    var messageToTest = "This is a test description";

    var change = (page as InternalAppsPage).SetupApproval(messageToTest);

    Assert.IsTrue(messageToTest == change.Description);
}

我很确定这段代码有很多问题(欢迎提出改正意见),但我的主要目标是开始为整个项目实施一些测试。我决定从小处着手-一个方法一次。我首先尝试创建一个新的测试项目,但由于SetupApproval方法是受保护的,所以我无法访问它。我的下一步尝试是将TestMethod放在基本页面中,但那样就没有运行测试的方法了。
最后,我正在使用Visual Studio 2008的默认测试框架。
1个回答

15

有两种选择:

  • 假设DerivedFromBaseClass是一个仅用于测试的类,只需提供一个新的 public(或internal)方法,该方法仅调用SetupApproval并返回其返回值。
  • 将该方法更改为protected internal,确保您的测试程序集已设置InternalsVisibleTo以访问内部方法。在文档中说明这是为了进行测试。

第一种选择更干净,第二种选择更简单,特别是如果您有许多受保护的方法,并且基类是非抽象的。


我并不是打算仅仅为了测试而使用DerivedFromBasClass,但这样做非常有意义,所以我会专门为测试创建一个。谢谢! - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接