2009-12-11 6 views
4

나는이 객체에 대해 Properties.Settings.Default... 값을 참조하는 객체가 있으며이 객체의 단위 테스트에서 이들을 스텁해야합니다.단위 테스트가 다른 어셈블리에있을 때 Properties.Settings 개체를 스텁하는 방법은 무엇입니까?

불행히도 설정 객체의 유형은 internal으로 선언되어 단위 테스트 프로젝트에서 액세스 할 수 없습니다.

어떻게 이러한 속성에 대한 반환 값을 스텁링 할 수 있습니까? mocking을 위해 Rhino Mock을 사용하고 있습니다.

답변

7

일반적으로 나는 그렇지 않습니다. Properties.Settings.Default를 실제로 읽는 "내부"객체 대신에 (구성시 또는 속성을 통해) 구성 가능한 속성을 선언하게하고 다른 코드를 채워야합니다.

그런 식으로 단위 테스트에서 기본 읽기 물건 이외의 모든 것을 테스트 할 수 있습니다. 그러면 기본값을 읽지 않는 방식으로 결합되어 나중에 메커니즘을 쉽게 전환 할 수 있습니다.

+1

예, 속성에 의존하지 않음으로써 개체를 더 재사용 할 수 있습니다. 설정 – Benny

+1

"휴식 가능성이 적습니다." 기본값을 조회하면 객체의 실제 작업과 설정 찾기 위치를 아는 두 가지 책임이 있습니다. properties.settings에 의존하는 1000 개의 클래스가 있고 그 데이터가 다른 곳에서 오기를 원한다면 심각한 고통이 될 것입니다! – kyoryu

3

내부 문제를 해결하는 데 유용한 또 다른 팁은 실제로 내부 코드를 선택적으로 유닛 테스트에 표시 할 수 있습니다. 테스트중인 코드에서, 당신의 AssemblyInfo.cs를 열고 다음과 같이 뭔가를 추가

#if UNITTEST 
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("YourUnitTestAssembly")] 
#endif 

그런 다음 당신은 그냥 모든 내부 구성원을 볼 수있을 것입니다 빌드와 테스트 어셈블리에 정의 유닛 테스트에 기호를 필요 .

0

나는 이것이 오래된 질문이라는 것을 알고있다. 그러나 나는 그 해결책이 간단하고 누군가를 도울 수 있다고 생각했다.

생성 된 설정 클래스는 부분 클래스이므로이를 활용하여 자체 구현을 만들 수 있습니다. 당신이 클래스를 생성, 테스트에서 값을 설정하려면 우리가 다른 곳에서 우리가 Settings.Get .. 를 호출 할 수있는 응용 프로그램을 사용할 때

internal partial class Settings : ISettings 
{ 
    private static ISettings _setInstance; 

    internal static ISettings Get 
    { 
     get 
     { 
      return _setInstance = _setInstance ?? Default; 
     } 
     set { _setInstance = value; } 
    } 
} 

다음 속성 폴더에 새 파일을 만듭니다 ISettings에서 상속 받고 새 구현을 설정합니다.

테스트가 별도의 프로젝트에서 발견되면 세터를 공개하기 위해 다른 클래스를 추가해야합니다. 다음에 값을 변경하거나 값을 추가 할 때 설정 파일을 덮어 쓰게되므로 설정 파일을 public으로 변경할 수 없습니다.