2011-12-07 4 views
3

저는 Pex와 Moles를 처음 사용합니다. 내 코드에서 Pex를 실행하려고하는데 Constructor injection을 사용하고있다. Pex에게 생성자 주입 방법을 지시하는 방법이 있습니까?Pex & Moles - Dependencey Injection

편집

public UserLogic(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 

    public int GetUsersAge(int id) 
    { 
     User user = _userRepository.GetById(id); 
     DateTime DOB = user.DOB; 
     DateTime now = DateTime.Today; 
     int age = now.Year - DOB.Year; 
     if (DOB > now.AddYears(-age)) age--; 
     return age; 
    } 

나는 스텁 userRepository를 주입해야합니다. _userRepository.GetById (id)를 호출하면 Pex가 NullReferenceException으로 실패합니다. 나는 단위 테스트를 위해 Moq를 사용하고 있었지만 pex와 moles로 바꾸고 싶다.

내 스텁을 만들기 위해 PexFactories를 사용해야 할까?

+0

쇼 몇 가지 코드, 당신은 두더지와 코드를 대체 할 수 있습니다. – Peter

+0

이것은 완전히 사실이 아닙니다. Moles를 사용할 수없는 시나리오가 있습니다 (예 : http://social.msdn.microsoft.com/Forums/en-US/pex/thread/c262d8f1-246e-4157). -a7b4-f7ddeaf1890c /) – Gorgsenegger

+0

한 가지 더 생각해 보면, 처음부터 응용 프로그램을 디자인 할 수있는 기회가 있다면 인터페이스를 적절하게 사용하는 한 일반적으로 MOQ를 사용하는 것이 좋습니다. 두더지는 더 이상 변경할 수 없거나 허용 할 수없는 기존 코드를 도울 수 있습니다. – Gorgsenegger

답변

1

Poles가 생성 한 매개 변수화 된 테스트에 Moles Stub 유형을 전달해보십시오. 매개 변수화 된 테스트를 만들려면 탐색 할 클래스를 마우스 오른쪽 단추로 클릭 한 다음 PEX> 매개 변수화 된 단위 테스트 만들기을 선택하십시오. 이것은 인수를 포함하는 테스트 클래스에서 메소드를 생성합니다. 개별 테스트는이 매개 변수화 된 테스트를 호출하여 개별 테스트 인수를 보냅니다.

테스트중인 코드가 인수 (인터페이스 유형 지정 인수가 있음)를 통해 종속성 삽입을 사용하는 경우 Pex 생성 paramterized 테스트 메소드에는 동일한 인터페이스 유형 인수도 포함됩니다. 매개 변수화 된 메서드를 호출하는 자체 테스트 메서드를 작성하여 인터페이스 형식을 포함하여 자체 값을 제공 할 수 있습니다. 그냥 Pex 생성 파일에 쓰지 않도록하십시오!

단위 테스트 주입을 위해 몰 스텁 유형을 사용하는 것이 좋습니다. Microsoft Moles Reference Manual은 단위 테스트에서 Moles를 사용하는 방법을 배우기에 아주 좋은 곳입니다. 매개 변수가있는 테스트를 만들면 moles stub 유형이 인터페이스에 생성됩니다. 스텁 유형에 대한 우회 경로를 구성한 다음 매개 변수화 된 테스트에 전달하십시오.

스텁 유형 우회 도로 만들기는 매우 쉽습니다. 자주 사용되는 우회로를 구성하는 테스트 프로젝트에서 구성 방법을 만드는 것이 좋습니다. 보통이 메서드에 인수로 열거 플래그를 추가합니다. 그래서 어느 호출에서 특정 형식에 대한 생성을 우회하는지 쉽게 알 수 있습니다.

샘플 열거 :

[Flags()] 
public enum MoleConfigurations 
{ 
    MoleSqlClientObjects, 
    DisableDirectory_Exists, 
    DisableEventLogExtensions, 
    DisableInitializeDatabaseObjects, 
    DisableInitializeThreadingObjects, 
    DisableQueueExistingDataFiles, 
    DisableConstructor 
} 
+0

안녕하세요. 마이크. 필자는 귀하의 블로그에서 PEX 게시물을 읽었습니다. 응답 해 주셔서 감사합니다. 가능한가 아니면 간단한 예를 제공 할 것인가? 나는 내가 원하는 것을 간단한 예로서 나의 포스트를 업데이트했다. – ministrymason