2011-10-27 15 views
7

Ben alaycı çerçeve olarak Moq kullanıyorum ve belirli bir özel durum çalıştırıldığında, bir denemeyi denemeliyim; Yürütme bittiğinde durum bir kez çözülür. Eğer verebilir herhangi bir yardım içinBir alay ilk kez bir istisna atar ve ikinci bir değer döndürür nasıl

myMock = Mock<IFoo>(); 

myMock.Setup(m => m.Excecute()).Throws<SpecificException>(); 
myMock.Setup(m => m.Execute()); 

var classUnderTest = MyClass(myMock); 
classUnderTest.DoSomething(); 

Assert.AreEqual(expected, classUnderTest.Result); 

teşekkür:

Yani ne gerek benzer bir şeydir.

cevap

15

Bu, her bir çağrıda farklı değerlerin döndürülmesiyle ilgili Moq QuickStart örneğine dayanan bir yöntemdir.

var myMock = new Mock<IFoo>(); 
bool firstTimeExecuteCalled = true; 

myMock.Setup(m => m.Execute()) 
     .Callback(() => 
     { 
      if (firstTimeExecuteCalled) 
      { 
       firstTimeExecuteCalled = false; 
       throw new SpecificException(); 
      } 
     }); 

try 
{ 
    myMock.Object.Execute(); 
} 
catch (SpecificException) 
{ 
    // Would really want to call Assert.Throws instead of try..catch. 
    Console.WriteLine("Got exception"); 
} 

myMock.Object.Execute(); 
Console.WriteLine("OK!"); 
+0

Bu ilginç görünüyor, ancak yöntem geçersizse ve kurulumdan sonra "İade" yöntemini alamıyorum? Ve aslında bu "GetCountThing" bir int döndürürse çalışır, başka bir şey döndürürse derlenmez. –

+0

@SergioRomero - lütfen düzenlenen cevaba bakınız. – TrueWill

+0

Bir int değilse, 'Returns' satırından döndüğünüzü değiştirin. Bu, 'çağrı'ların değeri olmak zorunda değildir. – TrueWill

1

Neden aslında bunu yapar kendi deney nesnesi yazmayın:

var mock = new Mock<IFoo>(); 
var calls = 0; 
mock.Setup(foo => foo.GetCountThing()) 
    .Returns(() => calls) 
    .Callback(() => 
    { 
     calls++; 
     if (calls == 1) 
     { 
      throw new InvalidOperationException("foo"); 
     } 
    }); 

try 
{ 
    Console.WriteLine(mock.Object.GetCountThing()); 
} 
catch (InvalidOperationException) 
{ 
    Console.WriteLine("Got exception"); 
} 

Console.WriteLine(mock.Object.GetCountThing()); 

yöntem geçersiz, kullanımını döndürürse

? Eğer test etmek için kullanılacaksa, örn .:

public class Mock : IFoo 
{ 
    private int _calls; 

    public Mock() 
    { 
     _calls = 0; 
    } 

    public int Execute() 
    { 
     _calls++; 

     if (_calls == 1) 
      throw new Exception(); 

     return value; 

    } 

} 
+1

Örnek için aşağıdaki cevabımı inceleyin. Bu durumda bunu görebiliyordum. Bu bir kenar durum olsa da; Çoğu zaman bilinen sabit değerleri döndürecek bir saplama veya belirli bir yöntemin çağrıldığını doğrulayacak bir alay istiyorum. Moq, her ikisini de anında yaratmayı çok kolaylaştırıyor. Ayrıca, 30 üyeli eski bir arayüzünüz varsa ve sadece bu test için bunlardan birine ihtiyacınız varsa, Moq çözümü çok daha kısadır. – TrueWill

İlgili konular