MOQ - настройка метода на основе значений аргументов (несколько аргументов) - PullRequest
52 голосов
/ 02 ноября 2010

У меня есть интерфейс, определенный как

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

Я могу настроить базовый Moq для вышеперечисленного следующим образом:

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

назови это

mock.Object.AddNumbersBetween(1,4);

и затем убедитесь, что он называется

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

Я не могу понять, как настроить метод AddNumbersBetween таким образом, чтобы, если upperVal ниже, чем lowerVal, возникало исключение

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

По сути искал что-то вроде:

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

Ответы [ 2 ]

98 голосов
/ 01 декабря 2011

Я знаю, что это год, но я нашел способ использовать несколько параметров по крайней мере с последней версией Moq:

mock.Setup(x => x.Method(It.IsAny<int>(), It.IsAny<int>()))
    .Returns<int, int>((a, b) => a < b);
9 голосов
/ 02 ноября 2010

Для методов с одним аргументом самым чистым способом будет:

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

Это не может быть применено, если метод имеет несколько аргументов. Существует еще «обходной путь», который можно использовать, который имитирует то, чего вы хотите достичь:

/// <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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...