2010-11-02 12 views
30

MOQ - argüman değerlerine dayanan bir metodun oluşturulması (çoklu argümanlar)

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

olarak tanımlanan bir arabirim var. Yukarıdaki gibi temel bir Moq kurabilirim:

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

mock.Object.AddNumbersBetween(1,4); 

olarak adlandırıp

olarak adlandırın.
mock.Verify(m => m.AddNumbersBetween(1,4), Times.AtleastOnce()); 

AddNumbers yönteminin nasıl ayarlanacağını anlayamıyorumBöylece üstVal alt değerden daha düşükse bir istisna

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

+1

Her iki parametreye tam erişim sağladığından istisna atma mantığını bir Geri Arama ile basitçe uygulamanızı öneririz. Bildiğim kadarıyla, parametre eşleme cümleleri, yalnızca tek bir parametreye dayalı mantığı gerçekleştirebilir. –

cevap

62

ama MOQ son sürümü ile birden çok parametre kullanmak için bir yol bulmuş en az:

mock.Setup(x => x.Method(It.IsAny<int>(), It.IsAny<int>()) 
    .Returns<int, int>((a, b) => a < b); 
+0

+1 düzenledim, ancak yazım hatası var. (A, b) 'ile' {return a 'koymanız gerekir. – NightOwl888

+1

Teşekkürler, Piotr'in hallettiği gibi teşekkürler. – Gustyn

+1

Güzel, benim için çalıştı! – willem

8

Tek argüman yöntemleri, en temiz yol:

Yöntemin çeşitli argümanları varsa, bu uygulanamaz. kullanılabilecek bir 'çözüm' hala vardır, o size ulaşmak istediğiniz hedefe taklit: Bu bir yaşında olduğunu biliyoruz

/// <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

Bu, yalnızca tek bir parametrede çalışır ve birden çok parametrede değil –

+0

Benim kötü ... argümanların geçerliliğinizi geçmemesi durumunda istisnayı atacak bir geri arama ile bunun üstesinden gelmenin başka bir yolu vardır. Yanıtımı bu yöntemle – srodriguez