如何测试受保护的方法?

时间:2012-05-14 15:29:35

标签: unit-testing visual-studio-2008 protected

我有一个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 个答案:

答案 0 :(得分:13)

两个选项:

  • 假设DerivedFromBaseClass是一个仅用于测试的类,只需给它一个新的 public (或内部)方法,它只调用SetupApproval并返回返回值。
  • 改为使用方法protected internal,并确保为测试程序集设置了InternalsVisibleTo,以便它可以访问内部方法。记录这是为了测试。

第一个选项更清晰,第二个选项更简单,特别是如果你有很多受保护的方法基类是非抽象的。