Подтвердить что ты не робот

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.");
4b9b3361

Ответ 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(), который управляет тем, что попадает в ваши тесты.