Как настроить Moq для того же метода, где возвращаемое значение зависит от ввода? - PullRequest
0 голосов
/ 27 февраля 2020

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

// matching Func<int>, lazy evaluated
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true);

Протестированный метод выглядит следующим образом:

Task<DimensionStructure> GetDimensionStructureByIdAsync(DimensionStructure dimensionStructure);

Класс DimensionStructure выглядит следующим образом, он упрощен как на Id это важно.

public class DimensionStructure
    {
        public long Id { get; set; }
    }

Но когда я собираю макет, который мне нужен, пример ниже, когда он вызывается, он всегда возвращает null.

_masterDataWebApiClientMock.Setup(m => m.GetDimensionStructureByIdAsync(
                    It.Is<DimensionStructure>(
                        structure => structure.Id == 101)
                ))
               .ReturnsAsync(addedToRoot);
_masterDataWebApiClientMock.Setup(m => m.GetDimensionStructureByIdAsync(
                    It.Is<DimensionStructure>(
                        structure => structure.Id == 201 )
                ))
               .ReturnsAsync(addedToFirstLevel);

Дело в том, что метод получает другой параметр и возвращает разные объекты. В обоих случаях возвращается null. Согласно do c, он должен возвращать то, что находится в ReturnAsync, которое не является нулевым.

Он отлично работает в другом тесте, где значение свойства Id объекта не имеет значения.

_masterDataWebApiClientMock.Setup(m => m.GetDimensionStructureByIdAsync(It.IsAny<DimensionStructure>()))
               .ReturnsAsync(addedDimensionStructure);

Вопрос, как решить эту проблему?

Обновление - 02/29/2020

Когда я не указываю звонок Параметр тогда просто работает нормально. Тестирование метода немного сложнее, но решаемо.

_masterDataWebApiClientMock
               .Setup(m => m.GetDimensionStructureByIdAsync(
                    It.IsAny<DimensionStructure>()
                ))
               .ReturnsAsync(addedToRoot);

С другой стороны, я сообщил , что это особый возможный случай ошибки для людей Moq.

1 Ответ

1 голос
/ 28 февраля 2020

Собрав тестовый стенд следующим образом, я вижу, что он возвращает правильные значения. Кажется, либо мои предположения о IClassUnderTest неверны, либо вам может потребоваться убедиться, что addedToRoot и addedToFirstLevel определены при вызове вашего смоделированного метода .

Это, вероятно, не отвечает на ваш вопрос как таковой, однако я надеюсь, что это либо укажет вам правильное направление, либо запросит дополнительную информацию.

using System;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq; //I'm running Moq 4.13 

namespace UnitTestProject1
{
    public class DimensionStructure
    {
        public long Id { get; set; }
    }

    public interface ITest
    {
        Task<DimensionStructure> GetDimensionStructureByIdAsync(DimensionStructure dimensionStructure);
    }

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var addedToRoot = new DimensionStructure { Id = 1 };
            var addedToFirstLevel = new DimensionStructure { Id = 2 };

            var _masterDataWebApiClientMock = new Mock<ITest>();
            _masterDataWebApiClientMock.Setup(m => m.GetDimensionStructureByIdAsync(
                    It.Is<DimensionStructure>(
                        structure => structure.Id == 101)
                ))
                .ReturnsAsync(addedToRoot);
            _masterDataWebApiClientMock.Setup(m => m.GetDimensionStructureByIdAsync(
                    It.Is<DimensionStructure>(
                        structure => structure.Id == 201)
                ))
                .ReturnsAsync(addedToFirstLevel);


            Assert.AreEqual(1, _masterDataWebApiClientMock.Object.GetDimensionStructureByIdAsync(new DimensionStructure { Id = 101 }).Result.Id);
            Assert.AreEqual(2, _masterDataWebApiClientMock.Object.GetDimensionStructureByIdAsync(new DimensionStructure { Id = 201 }).Result.Id);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...