Moq - It.IsAny <string>() всегда возвращает ноль - PullRequest
19 голосов
/ 23 мая 2011

Что может заставить It.IsAny<string>() возвращать ноль при каждом вызове? Я не прав, предполагая, что он предназначен для возврата ненулевой строки?

Вот пример использования - метод Login создает исключение ArgumentNullException для нулевого второго аргумента (строка подключения). Я предполагал, что It.IsAny<string>() предоставит ненулевую строку, которая обойдет ArgumentNullException.

var mockApiHelper = new Mock<ApiHelper>();
mockApiHelper.Setup(m => m.Connect(It.IsAny<string>(), 
                                   It.IsAny<string>(), 
                                   It.IsAny<string>()));

var repositoryPlugin = new RepositoryPlugin(mockApiHelper.Object);
repositoryPlugin.Login(new CredentialsInfo(), It.IsAny<string>());

Assert.IsTrue(repositoryPlugin.LoggedIn, 
    "LoggedIn property should be true after the user logs in.");

Ответы [ 3 ]

25 голосов
/ 23 мая 2011

Ну, It.IsAny<TValue> просто возвращает результат вызова Match<TValue>.Create - который, в свою очередь, возвращает default(TValue).Это будет нулевым для любого ссылочного типа.

Не ясно, действительно ли вы вызываете его для нужного объекта, хотя - если вы не вызываете его на mock , а не нареальный код?

Все примеры, которые я видел, используют It.IsAny в контексте вызова mock.Setup.Не могли бы вы дать больше информации о том, как вы пытаетесь его использовать?

10 голосов
/ 23 мая 2011

Нет, It.IsAny используется для указания в вашей настройке, что любая передаваемая строка будет соответствовать.Вы можете выполнить настройку так, чтобы, если ваш метод вызывался только с определенной строкой, он возвращался.Учтите это:

myMock.Setup(x => x.DoSomething(It.IsAny<string>()).Return(123);
myMock.Setup(x => x.DoSomething("SpecialString").Return(456);

Все, что использует макет, получит разные значения в зависимости от параметра, который передается при вызове DoSomething.Вы можете сделать то же самое при проверке вызовов методов:

myMock.Verify(x => x.DoSomething(It.IsAny<string>())); // As long as DoSomething was called, this will be fine.
myMock.Verify(x => x.DoSomething("SpecialString"));  // DoSomething MUST have been called with "SpecialString"

Также, я вижу, вы редактировали свой вопрос.Вместо:

Assert.IsTrue(repositoryPlugin.LoggedIn, "LoggedIn property should be true after the user logs in.");

сделайте это:

mockApiHelper.Verify( x => x.Connect(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once()); // Change times to whatever you expect.  If you expect particular values, replace the relevent It.IsAny<string() calls with those actual vaules.
2 голосов
/ 23 мая 2011

It.IsAny используется для сопоставления его кода в ваших Returns() и Callback(), которые контролируют то, что вставляется в ваши тесты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...