Поделиться через


Использование закрытых методов доступа

Обновлен: Ноябрь 2007

Поскольку доступ к закрытым или внутренним методам тестируемого кода могут получить только методы в вызывающей иерархии, для косвенного вызова такого кода с ограниченным доступом, методам теста требуются закрытые методы доступа.

Закрытый метод доступа представляет собой сборку, содержащую затененные реализации каждого метода сборки в тестируемом коде. Каждый метод в закрытом методе доступа является открытым и принимает имя соответствующего метода в тестируемом коде. Вызов метода в закрытом методе доступа вызывает закрытый метод тестируемого кода. Это делает доступ к коду с квалификатором доступа private проще.

Bb385974.alert_note(ru-ru,VS.90).gifПримечание.

Закрытый метод доступа также предоставляет тестам доступ к закрытым переменным в тестируемом коде.

Закрытый метод доступа – это скомпилированная сборка в папке "Тестовые ссылки" обозревателя решений. Она имеет имя <assembly_name>.private_accessor, где <имя_сборки> – имя сборки, указанное в свойствах проекта.

Bb385974.alert_note(ru-ru,VS.90).gifПримечание.

Дополнительные сведения о тестировании элементов с внутренним квалификатором доступа см. в разделе Установка атрибута InternalsVisibleTo.

Создание закрытых методов доступа

При создании модульного теста для закрытого метода Visual Studio автоматически создает закрытый метод доступа, если он уже не существует в тестовом проекте.

При построении решения ссылки в закрытом методе доступа обновляются. Таким образом, после изменения продуктивного кода закрытый метод доступа следует соответствующим образом скомпилировать повторно для обновления.

Дополнительные сведения о создании закрытого метода доступа см. в разделе Практическое руководство. Тестирование закрытых методов.

Создание закрытых методов доступа вручную

Если закрытый метод доступа отсутствует в тестируемой сборке, его можно создать без создания методов теста.

Чтобы создать закрытый метод доступа или повторно создать удаленный закрытый метод доступа, щелкните правой кнопкой мыши в тестируемом коде. Затем в контекстном меню выберите команду Создать частный метод доступа и выберите тестовый проект, в который требуется добавить сборку закрытого метода доступа. Обратите внимание, что этот пункт будет отсутствовать в меню, если тестовый проект не существует в решении.

Bb385974.alert_note(ru-ru,VS.90).gifПримечание.

Закрытый метод доступа можно также создать из командной строки при помощи средства publicize.

Использование закрытых методов доступа

Чтобы протестировать закрытый код, сначала необходимо создать закрытый метод доступа, как описано в разделе Практическое руководство. Тестирование закрытых методов. Затем, тест должен создать экземпляр объекта, который будет обращаться к закрытому методу перед выполнением шагов теста.

Например, продуктивный код содержит следующий метод в классе BankAccount.

private void FreezeAccount()
{
    m_frozen = true;
}

Следующий метод теста тестирует закрытый метод FreezeAccount(). Чтобы получить доступ к методу FreezeAccount(), метод теста сначала должен создавать экземпляр объекта BankAccount_Accessor в сборке закрытого метода доступа. Это обусловлено тем, что BankAccount_Accessor содержит затененную реализацию FreezeAccount() – тестируемого метода. В следующем коде 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.");
}

Этот пример более подробно описывается в разделе Пошаговое руководство. Создание и запуск модульных тестов.

См. также

Задачи

Практическое руководство. Тестирование закрытых методов