Ответ 1
Я знаю, что это год, но я нашел способ использовать несколько параметров, по крайней мере, с последней версией Moq:
mock.Setup(x => x.Method(It.IsAny<int>(), It.IsAny<int>()))
.Returns<int, int>((a, b) => a < b);
У меня есть интерфейс, определенный как
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>();
Я знаю, что это год, но я нашел способ использовать несколько параметров, по крайней мере, с последней версией Moq:
mock.Setup(x => x.Method(It.IsAny<int>(), It.IsAny<int>()))
.Returns<int, int>((a, b) => a < b);
Для методов с одним аргументом самый чистый способ:
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;
}