使用专用访问器

更新:2007 年 11 月

由于只有调用层次结构中的方法才能访问测试代码的私有方法或内部方法,因此,测试方法需要专用访问器来间接调用此类访问受限的代码。

专用访问器是一种程序集,该程序集包含测试代码程序集的每种方法的隐藏实现。专用访问器中的每种方法都是公共的,并且采取测试代码中的相应方法的名称。调用专用访问器中的方法将调用测试代码的私有方法。这样,可以轻松地访问具有 private 访问限定符的代码。

说明:

专用访问器还使您的测试具有对测试代码中的私有变量的访问权限。

专用访问器是解决方案资源管理器的“测试引用”文件夹中一种经过编译的程序集。它的名称为 <assembly_name>.private_accessor,其中,<assembly_name> 是项目的属性中列出的程序集名称。

说明:

有关如何测试具有内部访问限定符的元素的更多信息,请参见设置 InternalsVisibleTo 属性

创建专用访问器

在为私有方法生成单元测试时,除非测试项目中已经存在专用访问器,否则,Visual Studio 将自动创建专用访问器。

生成解决方案将导致专用访问器中的引用更新。因此,在更改成品代码之后,应进行重新编译以便对专用访问器做出相应的更新。

有关如何生成专用访问器的信息,请参见如何:测试私有方法

手动创建专用访问器

如果测试下的程序集不存在专用访问器,则可以在不生成测试方法的情况下生成一个专用访问器。

若要创建一个专用访问器,或者重新创建一个已删除的专用访问器,请右击测试代码。然后,单击快捷菜单中的“创建专用访问器”并选择要放置此专用访问器程序集的测试项目。请注意,如果解决方案中不存在测试项目,则不会显示该菜单项。

说明:

您也可以使用 publicize 实用工具从命令提示符处创建专用访问器。

使用专用访问器

若要测试私有代码,请先创建专用访问器,如如何:测试私有方法所述。然后,测试必须先实例化将访问私有方法的对象,再执行其测试步骤。

例如,您的成品代码在 BankAccount 类中包含了以下方法:

private void FreezeAccount()
{
    m_frozen = true;
}

下面的测试方法测试私有的 FreezeAccount() 方法。若要访问 FreezeAccount() 方法,测试方法必须先实例化专用访问器程序集中的 FreezeAccount() 对象。这是必需的,因为 BankAccount_Accessor 包含要测试的 BankAccount_Accessor 方法的隐藏实现。在下面的代码中,FreezeAccount() 通过专用访问器的隐藏实现进行调用。

下面的示例代码是自动生成的,并且已由创建测试的人员编辑过。TODO 语句指示测试代码中必须在运行测试之前手动完成的语句。

[TestMethod()]
public void FreezeAccountTest()
{
    BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton", 11.99); // TODO: Initialize to an appropriate value
target.FreezeAccount(); 
    // Assert.Inconclusive("A method that does not return a value cannot be verified.");
    
    bool creditAccount = false; // False means account could be credited: Fail test. 
    // Try to credit account
    try
    {
        target.Credit(1.00); 
    }
    catch (System.Exception)
    {
        // Threw exception. FreezeAccount worked correctly: Pass test. 
    creditAccount = true;
    }
    
    // Assert fails if 'creditAccount' condition is false. Fail test.
    Assert.IsTrue(creditAccount, "Was able to credit account.");
}

此示例在演练:创建并运行单元测试中有更详细的介绍。

请参见

任务

如何:测试私有方法