전용 접근자 사용
업데이트: 2007년 11월
호출 계층 구조의 메서드만이 테스트 대상 코드의 전용 메서드 또는 내부 메서드에 액세스할 수 있으므로 이처럼 액세스가 제한된 코드를 간접적으로 호출하려면 테스트 메서드에 전용 접근자가 필요합니다.
전용 접근자는 테스트 대상 코드 어셈블리의 각 메서드에 대한 숨겨진 구현이 포함된 어셈블리입니다. 전용 접근자의 각 메서드는 공용 메서드이며 테스트 대상 코드에 있는 해당 메서드의 이름을 따릅니다. 전용 접근자에서 메서드를 호출하면 테스트 대상 코드의 전용 메서드가 호출됩니다. 이렇게 하면 private 액세스 한정자가 있는 코드에 손쉽게 액세스할 수 있습니다.
참고: |
---|
또한 전용 접근자를 사용하면 테스트에서 테스트 대상 코드의 private 변수에 액세스할 수 있습니다. |
전용 접근자는 솔루션 탐색기의 테스트 참조 폴더에 있는 컴파일된 어셈블리로, 이름은 <assembly_name>.private_accessor 형식입니다. 여기서 <assembly_name>은 프로젝트의 속성에 나열되어 있는 어셈블리 이름입니다.
참고: |
---|
내부 액세스 한정자가 포함된 요소를 테스트하는 방법에 대한 자세한 내용은 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.");
}
이 예제는 연습: 단위 테스트 생성 및 실행에 자세히 설명되어 있습니다.