Использование закрытых методов доступа
Обновлен: Ноябрь 2007
Поскольку доступ к закрытым или внутренним методам тестируемого кода могут получить только методы в вызывающей иерархии, для косвенного вызова такого кода с ограниченным доступом, методам теста требуются закрытые методы доступа.
Закрытый метод доступа представляет собой сборку, содержащую затененные реализации каждого метода сборки в тестируемом коде. Каждый метод в закрытом методе доступа является открытым и принимает имя соответствующего метода в тестируемом коде. Вызов метода в закрытом методе доступа вызывает закрытый метод тестируемого кода. Это делает доступ к коду с квалификатором доступа private проще.
Примечание. |
---|
Закрытый метод доступа также предоставляет тестам доступ к закрытым переменным в тестируемом коде. |
Закрытый метод доступа – это скомпилированная сборка в папке "Тестовые ссылки" обозревателя решений. Она имеет имя <assembly_name>.private_accessor, где <имя_сборки> – имя сборки, указанное в свойствах проекта.
Примечание. |
---|
Дополнительные сведения о тестировании элементов с внутренним квалификатором доступа см. в разделе Установка атрибута InternalsVisibleTo. |
Создание закрытых методов доступа
При создании модульного теста для закрытого метода Visual Studio автоматически создает закрытый метод доступа, если он уже не существует в тестовом проекте.
При построении решения ссылки в закрытом методе доступа обновляются. Таким образом, после изменения продуктивного кода закрытый метод доступа следует соответствующим образом скомпилировать повторно для обновления.
Дополнительные сведения о создании закрытого метода доступа см. в разделе Практическое руководство. Тестирование закрытых методов.
Создание закрытых методов доступа вручную
Если закрытый метод доступа отсутствует в тестируемой сборке, его можно создать без создания методов теста.
Чтобы создать закрытый метод доступа или повторно создать удаленный закрытый метод доступа, щелкните правой кнопкой мыши в тестируемом коде. Затем в контекстном меню выберите команду Создать частный метод доступа и выберите тестовый проект, в который требуется добавить сборку закрытого метода доступа. Обратите внимание, что этот пункт будет отсутствовать в меню, если тестовый проект не существует в решении.
Примечание. |
---|
Закрытый метод доступа можно также создать из командной строки при помощи средства 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.");
}
Этот пример более подробно описывается в разделе Пошаговое руководство. Создание и запуск модульных тестов.