2012-08-03 2 views
3

Visual Studio의 자체 "단위 테스트 만들기 ..."옵션을 사용하여 개인 메서드에 대한 단위 테스트를 생성했습니다.Visual Studio 비공개 접근 및 코드 체크인

위대한,하지만 작동합니다.하지만 VS 지금 빌드 할 필요가있는 AppData/Local/Temp Private Accor 클래스를 만들었으므로 코드를 확인하려고하면 빌드를 깰. 이 파일을 내 소스 트리에 넣으려고하면 컴파일러에서 "본문을 정의해야합니다"라고 말하면서 컴파일되지 않습니다. 내가 처음 배우기 시작했을 때 나는 잠시 동안 그것을 사용 않았지만, 나는이 기능을 사용하지 않는

#region Assembly AgentConfiguration_Accessor.exe, v4.0.30319 
// C:\Projects\AgentConfigurationTests\obj\Debug\AgentConfiguration_Accessor.exe 
#endregion 

using Agent.ConfigurationData; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System; 

namespace Agent.AgentConfiguration 
{ 
    [Shadowing("Agent.AgentConfiguration.AgentConfigurationGui")] 
    public class AgentConfigurationGui_Accessor : BaseShadow 
    { 
     protected static PrivateType m_privateType; 

     [Shadowing("[email protected]")] 
     public AgentConfigurationGui_Accessor(); 
     public AgentConfigurationGui_Accessor(PrivateObject value); 

     [Shadowing("_agentPaths")] 
     public AgentPaths _agentPaths { get; } 
     [Shadowing("_agentServiceName")] 
     public static string _agentServiceName { get; set; } 
     [Shadowing("[email protected]")] 
     public void UpdateStatus(string statusMessage); 
    } 
} 

답변

2

잠시 동안 프라이빗 액세서를 사용하고 나서 우리는 우리의 Souce Code Versioning 시스템으로 분기하고 병합 한 후 코드를 컴파일하는 데 어려움을 겪었습니다.

주제에 대한 연구를 시작했고 Visual Studio Team Test 블로그에 기사가 있습니다. 지금까지 내가 이해 한대로 아니요은 더 이상 개인용 악세서리 클래스를 사용합니다. 으로부터 제거 할 수있다

우리는 비주얼 스튜디오 2010 이러한 기능을 작동 중지 :

이 기능 이 더 이상 지원되지 않는다는 내용의 Generation of Private Accessors (Publicize) and Code Generation for Visual Studio 2010의 블로그 기사가있다 다음 릴리스의 제품 이것은 때문이다 다음과 같은 이유에 :

  • 자원과 시간의 부족이 릴리스에 대한 초점이 저하 된 기능을 코드 생성 수동 테스터의 경험 때문에 우선 순위를 개선하고 홍보하는 것이 었습니다 . 도 공개되었으므로 우리는 이라는 기능을 사용하여 해결되지 않았습니다.
  • 언어 팀별 새로운 기능 : 언어 팀이 프로젝트 유형 및 언어를 수정함에 따라 변경 사항에 응답 할 수 없으며 은 가지고있는 새로운 기능을 사용할 수 없었습니다. 도입되었습니다.

은 물론 대신 무엇을 할 수 있는지에 대한 제안이 있습니다됩니다

  1. 사용 : 내부 API를 테스트를 계속하고자하는 사람들을 위해

    을 세 가지 옵션이 있습니다 Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject 클래스는 코드에서 내부 API와 비공개 API에 액세스하는 데 도움을줍니다. Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 어셈블리에 있습니다.

  2. 내부 또는 비공개 API에 액세스하기 위해 코드를 반사 할 수있는 리플렉션 프레임 워크를 만듭니다.
  3. 액세스하려는 코드가 내부 코드 인 경우 내부 코드에 코드가 액세스 할 수 있도록 InternalsVisibleToAttribute를 사용하여 API에 액세스 할 수 있습니다.
1

: 정말이 반사 종달새을 이해하지 ...

은 접근 클래스입니다 단위 테스트에 대해서. 일반적으로 단위 테스트는 클래스의 공용 표면을 테스트해야합니다. 이 원리를 시작하면 접근 자 클래스가 필요 없습니다.

하지만 수업에서 중요한 개인 논리를 어떻게 테스트합니까? 저는 일반적으로 개인적인 방법을 도우미 클래스로 추출하여 공용 메서드가됩니다 ("단일 책임 원칙"이라고 생각하십시오). 물론 공개 메서드로 접근 클래스없이 테스트 할 수 있습니다. 그런 다음 원래 클래스는 도우미 클래스의 개인 인스턴스를 가져옵니다.

테스트에서 접근 자 클래스를 피할 수있을뿐만 아니라이 방법을 사용하면 테스트에서 모의 ​​객체를보다 쉽게 ​​사용할 수 있습니다. 원래 클래스를 테스트 할 때 "실제"도우미 클래스를 제공하는 대신 모의 인스턴스를 제공합니다. 이렇게하면 원래 클래스에 대한 테스트가 도우미 클래스의 논리와 분리됩니다. 도우미 클래스에 버그가있는 경우 도우미 클래스의 테스트는 실패하지만 원래 클래스의 테스트에는 영향을주지 않습니다.

+0

예 개인적인 방법을 테스트하여 재미있는 느낌을 얻었습니다. 나는 문제의 메소드를 랩핑하고 그런 식으로 처리하기 위해 모의 (mock)를 사용했다. VS에서 프로젝트를 수행하는 방법을 알아야하고 프로젝트의 이식성을 유지하는 것이 좋습니다. – Mijin