2012-07-21 3 views
5

한다고 가정 나는 다음과 같은 개체가 :비웃음 Guid.NewGuid()

public class User 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
    public Guid UserGuid { get; set; } 
    public Guid ConfirmationGuid { get; set; } 
} 

다음과 같은 인터페이스 방법 :

void CreateUser(string username); 

두 개의 새로운 GUID를 생성해야합니다 구현의 일부 : UserGuid 하나를, ConfirmationGuid에 대한 또 다른. 값을 Guid.NewGuid()으로 설정하여이 작업을 수행해야합니다.

이미 인터페이스를 사용하여() Guid.NewGuid을 추상화 한 : 하나의 새로운 GUID이 필요할 때

public interface IGuidService 
{ 
    Guid NewGuid(); 
} 

그래서 나는 쉽게 조롱 수 있습니다. 그러나 두 메서드를 하나의 메서드 내에서 동일한 메서드로 모방하는 방법을 모르는 것이므로 서로 다른 값을 반환합니다. 당신은 MOQ를 사용하는 경우

답변

9

, 당신은 사용할 수 있습니다

mockGuidService.SetupSequence(gs => gs.NewGuid()) 
    .Returns(...some value here...) 
    .Returns(...another value here...); 

을 당신은 또한 다음과 같은 할 수있는 가정 : 당신은 그냥 반환 내에서 임의의 값을 제공하지 않는 한, 여전히

mockGuidService.Setup(gs => gs.NewGuid()) 
    .Returns(() => ...compute a value here...); 

기능, 질서에 대한 지식은 여전히 ​​중요한 것으로 보인다.

+0

그러나 이것은 특정 시퀀스의 구현에서 속성을 설정한다고 가정하지 않으시겠습니까? 이게 내 시험의 염려가 아닌가? 즉,이 필드는 임의의 순서로 설정할 수 있습니다. 어떤 이유로 든 테스트를 업데이트하지 않고이 순서를 변경하면 내 테스트가 이상적으로 통과해야합니다. –

+0

음 ... 당신은 상태 대 행동 테스트에 조금 빠져 들었습니다. 전화 주문에 대한 지식을 전제로하지 않고 질문에 대답하는 방법을 모르겠습니다. –

+3

내가 올바르게 이해한다면, 당신은'Assert.AreEqual (guid1, user.UserGuid); Assert.AreEqual (guid2, user.ConfirmationGuid);'할당 순서를 변경하면 실패합니다. 대신 순서에 관계없이 다음과 같은 일종의 콜렉션 어설 션을 사용해야합니다 : CollectionAssert.AreEquivalent (new [] {guid1, guid2}, new [] {user.UserGuid, user.ConfirmationGuid}) ; ' –

4

@ Matt의 예와 같이 Moq를 사용할 수 없다면 본질적으로 똑같은 작업을 수행 할 자신 만의 클래스를 만들 수 있습니다.

public class GuidSequenceMocker 
{ 
    private readonly IList<Guid> _guidSequence = new[] 
                { 
                 new Guid("{CF0A8C1C-F2D0-41A1-A12C-53D9BE513A1C}"), 
                 new Guid("{75CC87A6-EF71-491C-BECE-CA3C5FE1DB94}"), 
                 new Guid("{E471131F-60C0-46F6-A980-11A37BE97473}"), 
                 new Guid("{48D9AEA3-FDF6-46EE-A0D7-DFCC64D7FCEC}"), 
                 new Guid("{219BEE77-DD22-4116-B862-9A905C400FEB}") 
                }; 
    private int _counter = -1; 

    public Guid Next() 
    { 
     _counter++; 

     // add in logic here to avoid IndexOutOfRangeException 
     return _guidSequence[_counter]; 
    } 
} 
관련 문제