2010-11-02 9 views
30

I eine Schnittstelle definiert alsMOQ - Einstellung eines Verfahrens up basierend auf Argumentwerte (mehrere Argumente)

interface IMath 
{ 
AddNumbersBetween(int lowerVal, int upperVal); 
} 

I Setup ein basisches Moq für das obige wie folgt:

Mock<IMath> mock = new Mock<IMath>();  
mock.Setup(m => m.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>())); 

Aufruf es

mock.Object.AddNumbersBetween(1,4); 

und dann überprüfen, ob es hieß

mock.Verify(m => m.AddNumbersBetween(1,4), Times.AtleastOnce()); 

ich kann nicht herausfinden, wie die Einrichtung die Methode AddNumbersBetween, so dass, wenn die upperVal niedriger ist als die lowerVal eine Ausnahme ausgelöst wird

mock.Object.AddNumbersBetween(4,1);//should throw an exception 

Wesentlichen für so etwas suchen:

mock.Setup(foo => foo.AddNumbersBetween("arg1 is higher than arg2")).Throws<ArgumentException>(); 
+1

Ich würde empfehlen, die Ausnahme-werfende Logik mit einem Callback einfach zu implementieren, weil das vollen Zugriff auf beide Parameter gibt. Soweit ich weiß, können die Parameter-Matching-Klauseln nur Logik basierend auf einem einzelnen Parameter ausführen. –

Antwort

62

Ich weiß, das ein Jahr alt ist, aber ich fand einen Weg, um mehrere Parameter zu verwenden, mit der neuesten Version von Moq mindestens:

+0

+1 bearbeitet, aber Sie haben einen Tippfehler. Sie müssen ein '=>' zwischen '(a, b)' und '{return a NightOwl888

+1

Danke, sieht aus wie Piotr kümmerte sich darum, danke. – Gustyn

+1

Schön, arbeitete für mich! – willem

8

Für Argument Methoden, wäre der sauberste Weg:

mock.Setup(foo => foo.Submit(IsLarge())).Throws<ArgumentException>(); 
... 
public string IsLarge() 
{ 
    return Match<string>.Create(s => !String.IsNullOrEmpty(s) && s.Length > 100); 
} 

Dies kann nicht angewendet werden, wenn die Methode mehrere Argumente hat. Es gibt immer noch eine ‚Abhilfe‘, die verwendet werden könnten, dass imitiert, was Sie erreichen wollen:

/// <summary> 
/// Tests if a moq can send an exception with argument checking 
///</summary> 
[TestMethod] 
public void TestException() 
{ 
    Mock<IMath> mock = new Mock<IMath>(); 
    mock.Setup(m => m.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>())); 

    mock.Setup(foo => foo.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>())) 
     .Callback<int, int>((i, j) => CheckArgs(i, j)); 

    try 
    { 
     mock.Object.AddNumbersBetween(1, 2); 
    } 
    catch (Exception ex) 
    { 
     // Will not enter 
     Console.WriteLine("Exception raised: {0}", ex); 
    } 
    try 
    { 
     mock.Object.AddNumbersBetween(2, 1); 
    } 
    catch (Exception ex) 
    { 
     // Will enter here, exception raised 
     Console.WriteLine("Exception raised: {0}", ex); 
    } 
} 

private bool CheckArgs(int i, int j) 
{ 
    if(i > j) 
     throw new ArgumentException(); 
    return true; 
} 
+0

Dies funktioniert nur für einen einzigen Parameter und nicht mehrere Parameter –

+0

Mein Fehler ... Es gibt eine andere Möglichkeit, dies zu behandeln, mit einem Callback, der die Ausnahme auslöst, wenn die Argumente Ihre Validierung nicht bestehen. Ich habe meine Antwort mit dieser Methode – srodriguez

Verwandte Themen