Как упростить параметры It.IsAny <T>() для настройки Mocks - PullRequest
1 голос
/ 08 ноября 2019

В наших модульных тестах мы часто используем Mock.Setup. Это приводит к таким утверждениям, как:

_mockedModel.Setup(x => x.Method1(It.IsAny<string>(), It.IsAny<object>(),It.IsAny<string>())).Returns(1);
_mockedModel.Setup(x => x.Method2(It.IsAny<string>(), It.IsAny<object>(), It.IsAny<object>())).Returns(1);
_mockedModel.Setup(x => x.Method3(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<string>())).Returns(1);
_mockedModel.Setup(x => x.Method4(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<object>())).Returns(1);

Это довольно многословно, и я хотел бы упростить параметры It.IsAny<T>().

Мы попытались сделать следующее:

Func<string> s = It.IsAny<string>;
Func<object> o = It.IsAny<object>;
_mockedModel.Setup(x => x.Method1(s(), o(), o())).Returns(1);
_mockedModel.Setup(x => x.Method2(s(), o(), o())).Returns(1);
_mockedModel.Setup(x => x.Method3(o(), o(), s())).Returns(1);
_mockedModel.Setup(x => x.Method4(o(), o(), o())).Returns(1);

Но, хотя это не дает никаких ошибок, оно не устанавливает Mock. Например, методы с 1 по 4 возвращают 0, а не 1.

Ответы [ 2 ]

3 голосов
/ 08 ноября 2019

Но, хотя это не дает никаких ошибок, оно не устанавливает макет. Например, методы с 1 по 4 возвращают 0, а не 1.

Это потому, что Moq Setup явно ищет It.IsAny<T>() статический вызов метода в выражении, чтобы правильно настроить настройку. Это сделано специально.

Переходя к функции в попытке упростить выражение, вы заставляете выражение вызывать вызов метода, который возвращает значение по умолчанию для аргумента универсального типа.

ИтакВаше выражение эффективно становится

_mockedModel.Setup(x => x.Method1(null, null, null)).Returns(1);
//...
0 голосов
/ 08 ноября 2019

@ Ответ Нкози помог мне придумать решение. Решение состоит в том, чтобы поместить вызовы It.IsAny () внутри свойства (или метода):

private static string Str => It.IsAny<string>();
private static object Obj => It.IsAny<object>();

Это позволяет написать код следующим образом:

_mockedModel.Setup(x => x.Method1(Str, Obj, Obj)).Returns(1);
_mockedModel.Setup(x => x.Method2(Str, Obj, Obj)).Returns(1);
_mockedModel.Setup(x => x.Method3(Obj, Obj, Str)).Returns(1);
_mockedModel.Setup(x => x.Method4(Obj, Obj, Obj)).Returns(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...