2012-07-21 14 views
5

Supongamos que tengo la siguiente entidad:que imita 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; } 
} 

Y el siguiente método de interfaz:

void CreateUser(string username); 

parte de la implementación debe crear dos nuevos GUID: una para UserGuid, y otro para ConfirmationGuid. Deberían hacer esto estableciendo los valores en Guid.NewGuid().

ya he abstraído Guid.NewGuid() usando una interfaz:

public interface IGuidService 
{ 
    Guid NewGuid(); 
} 

, así que puede burlarse fácilmente esto cuando sólo se necesita un nuevo GUID. Pero no estoy seguro de cómo simular dos llamadas diferentes al mismo método, desde un solo método, de modo que devuelvan valores diferentes.

Respuesta

9

Si está utilizando Moq, puede utilizar:

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

supongo que también podría hacer lo siguiente:

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

Sin embargo, a menos que se le acaba el suministro de un valor aleatorio dentro de la devolución función, el conocimiento del orden todavía parece ser importante.

+0

Pero, ¿no supondría que estoy configurando las propiedades en la implementación en una secuencia determinada? ¿No está nublando las preocupaciones de mi prueba? En otras palabras, estos campos se pueden establecer en cualquier orden, y si por algún motivo modifico esta orden sin actualizar mis pruebas, lo ideal es que mis pruebas pasen. –

+0

Bueno ... te estás metiendo un poco en las pruebas estatales vs. de comportamiento. No estoy seguro de cómo responder la pregunta sin asumir el conocimiento sobre el orden de las llamadas. –

+3

Si entiendo correctamente, no desea tener 'Assert.AreEqual (guid1, user.UserGuid); Assert.AreEqual (guid2, user.ConfirmationGuid); 'falla si cambia el orden de asignación. En su lugar, debe usar algún tipo de afirmación de colección que sea independiente del orden (disponible en nunit y mstest): 'CollectionAssert.AreEquivalent (new [] {guid1, guid2}, new [] {user.UserGuid, user.ConfirmationGuid}) ; ' –

4

Si no puede usar Moq como en el ejemplo de @ Matt, entonces puede construir su propia clase que hará esencialmente lo mismo.

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]; 
    } 
} 
Cuestiones relacionadas