2011-08-12 19 views

cevap

39

Ben Callback faydalanmak ve Callback içinden bir istisna edilip edilmeyeceğini belirlemek için bir sayacını artırmak olacaktır.

[Test] 
public void TestMe() 
{ 
    var count = 0; 
    var mock = new Mock<IMyClass>(); 
    mock.Setup(a => a.MyMethod()).Callback(() => 
     { 
      count++; 
      if(count == 1) 
       throw new ApplicationException(); 
     }); 
    Assert.Throws(typeof(ApplicationException),() => mock.Object.MyMethod()); 
    Assert.DoesNotThrow(() => mock.Object.MyMethod()); 
} 

public interface IMyClass 
{ 
    void MyMethod(); 
} 
+0

Bu iyi bir cevaptır ve 2'den fazla şeyin olmasını istediğinizde bu yaklaşım tercih edilir. – anthony

+0

Bu yaklaşım güzel, ama @Mathias' cevabını Phil Haack tarafından söz konusu yayını kontrol hangi basittir. Oldukça kaygan. Eğer reader.Setup (r => r.Read()) 'gibi bir şey yapabilirsiniz bir uzantısı yöntemi kullanarak ReturnsInOrder (doğru, doğru, yanlış);. Eğer bir değerler dizisi dönmek istiyorsanız' – rsbarro

+3

ReturnsInOrder() güzel ama Sıralamanın bir parçası olarak bir istisna atmak için nasıl kullanılacağı kolayca anlaşılmadı. – anthony

16

Ben şimdiye kadar ile geldim en iyi şudur:

interface IFoo 
{ 
    void Bar(); 
} 

[Test] 
public void TestBarExceptionThenSuccess() 
{ 
    var repository = new MockRepository(MockBehavior.Default); 
    var mock = repository.Create<IFoo>(); 

    mock.Setup(m => m.Bar()). 
     Callback(() => mock.Setup(m => m.Bar())). // Setup() replaces the initial one 
     Throws<Exception>();      // throw an exception the first time 

    ... 
} 
+1

+ 1 Bu harika bir yaklaşım. Sadece orada olanlara kodun içine karışmış biri için net olmayabilir. – rsbarro

+3

Parlak. Bu benim için harika çalıştı. –

+0

Güzel olan, bunu düşünmedim! tarihi üzerinden sahte mendil değiştirilmesi yapamayacağı böylece –

5

Phil Haack belli bir sonuç dizisi dönmek için bir yöntem kurma hakkında ilginç blog post sahiptir. Bazı işler çünkü bunun, belirli türde bir değerler dizisi, yer ile o iyi bir başlangıç ​​noktası olacağını görünüyor Tür T veya bir istisna olabilir sonuçlarının bir dizilişe sahip olduğu şimdi gerekir. (@RichardBarnett yorum tarafından belirtildiği gibi) sadece yerleşik bir yöntem SetupSequence() kullanabilirsiniz MOQ 4.2 ile başlayarak

+0

ilginç bir okuma, teşekkürler. – anthony

3

.

Örnek:

var mock = new Mock<IMyClass>(); 
mock.SetupSequence(x => x.MyMethod("param1")) 
    .Throws<MyException>() 
    .Returns("test return"); 
İlgili konular