2012-07-21 10 views
5

varsayalım Aşağıdaki varlık var:alaycı 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; } 
} 

Ve aşağıdaki arayüz yöntemi:

void CreateUser(string username); 

iki yeni Guıd oluşturmalısınız uygulama Bölüm: UserGuid için bir, ve ConfirmationGuid için bir başka. Değerleri Guid.NewGuid() olarak ayarlayarak bunu yapmalıdırlar.

Zaten bir arayüz kullanarak() Guid.NewGuid soyutlamak: tek yeni bir GUID gerektiğinde

public interface IGuidService 
{ 
    Guid NewGuid(); 
} 

yüzden kolayca bu taklit. Ancak, iki farklı çağrının, aynı yöntemi kullanarak, bir yöntem içinde, farklı değerler döndürecek şekilde nasıl alay edileceğinden emin değilim. Eğer Moq kullanıyorsanız

cevap

9

, şunları kullanabilirsiniz:

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

ben aşağıdakileri de herhalde: sadece getiri içinde rasgele bir değer vermekteyiz sürece, Still

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

Fonksiyon, sipariş bilgisi hala önemli gibi görünmektedir.

+0

Ancak, bu, uygulamadaki özellikleri belirli bir sıraya koyduğumu varsayar mı? Bu benim sınavımın kaygılarını bulanıklaştırmıyor mu? Başka bir deyişle, bu alanlar herhangi bir sıraya göre ayarlanmış olabilir ve eğer bir sebepten dolayı testlerimi güncellemeden bu siparişi değiştirirseniz, testlerim ideal olarak geçmelidir. –

+0

Şey ... devlete karşı davranış testi biraz alıyorsun. Çağrı sırasına ilişkin bilgi varsayımı yapmadan soruyu nasıl cevaplayacağımı bilemiyorum. –

+3

Eğer doğru anlıyorsam, Assert.AreEqual (guid1, user.UserGuid); Assert.AreEqual (guid2, user.ConfirmationGuid); atama sırasını değiştirirseniz başarısız olur. Bunun yerine, emirden bağımsız bir tür tahsilat iddiası kullanmalısınız (hem rahibe hem de mestest'te mevcuttur): 'CollectionAssert.AreEquivalent (yeni [] {guid1, guid2}, new [] {user.UserGuid, user.ConfirmationGuid}) –

4

Moq'u, Matt'in örneğinde olduğu gibi kullanamıyorsanız, temelde aynı şeyi yapacak olan kendi sınıfınızı oluşturabilirsiniz.

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]; 
    } 
} 
İlgili konular