Moq - It.IsAny <string>() всегда возвращает null
Что может заставить It.IsAny<string>()
возвращать значение null при каждом вызове? Я ошибаюсь в предположении, что он предназначен для возврата непустой строки?
Здесь использование - где метод Login генерирует ArgumentNullException для нулевого 2-го аргумента (строка подключения). Я предполагал, что 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.");
Ответы
Ответ 1
Ну, It.IsAny<TValue>
просто возвращает результат вызова Match<TValue>.Create
- который, в свою очередь, возвращает default(TValue)
. Это будет нулевым для любого ссылочного типа.
Не ясно, действительно ли вы на самом деле вызываете его на нужном объекте - не следует ли вы называть его ложным, а не реальным кодом?
Все образцы, которые я видел, используют It.IsAny
в контексте вызова mock.Setup
. Не могли бы вы дать больше информации о том, как вы пытаетесь его использовать?
Ответ 2
Нет, It.IsAny используется для указания в вашей программе установки, которая соответствует любой переданной строке. Вы можете сделать свою настройку так, чтобы, если ваш метод вызывается только с определенной строкой, он вернется. Рассмотрим это:
myMock.Setup(x => x.DoSomething(It.IsAny<string>()).Return(123);
myMock.Setup(x => x.DoSomething("SpecialString").Return(456);
Все, что использует mock, будет получать разные значения в зависимости от параметра, который mock передается при вызове 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.
Ответ 3
It.IsAny
используется для сопоставления его кода в Returns()
и Callback()
, который управляет тем, что попадает в ваши тесты.