Модульное тестирование одного метода вызывает другой метод в том же классе - PullRequest
1 голос
/ 13 февраля 2020

У меня есть два метода publi c для класса, оба вызываются из внешнего кода, но один из методов также вызывает другой. Я хочу провести модульное тестирование одного метода и просто проверить, что он вызывает другой метод publi c в том же классе, а затем у меня будут отдельные тесты для тестирования другого второго метода. Структура будет выглядеть примерно так:

public CalculatedResult GetCalculatedDetailsById(Guid id)
{
  var entity = _entityRepository.GetEntity(id);
  if(entity == null)
  {
    throw new NotFoundException();
  }

  return GetCalculatedDetailsForEntity(entity);
}

public CalculatedResult GetCalculatedDetailsForEntity(Entity entity)
{
  var supplementalData = _someDependency.GetSupplementalData(entity.Property);
  var calculatedData = _someOtherDependency.ProcessEntity(entity, supplementalData);

  _cache.Set(calculatedData, expiry);

  return calculatedData;
}

Для GetCalculatedDetailsForEntity я бы смоделировал зависимости, проверил, что они правильно вызваны, проверил, правильно ли установлен кеш, проверил, что возвращаемое значение соответствует ожидаемому предоставленный ввод и проверенные значения.

Для GetCalculatedDetailsById Я бы смоделировал зависимость хранилища, проверил, что он вызвал GetEntity, как и ожидалось, и что он выдает исключение при необходимости. Затем я хочу убедиться, что он вызывает GetCalculatedDetailsForEntity с ожидаемым объектом, но я не хочу проверять, что он выполняет все логические операции c в GetCalculatedDetailsForEntity, поскольку я уже проверял это в другом месте.

Можно ли смоделировать GetCalculatedDetailsForEntity для тестов GetCalculatedDetailsById только для того, чтобы я мог убедиться, что он вызывается так, как ожидалось?

Мой технический стек: NET Core, XUnit и Moq.

Ответы [ 2 ]

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

Вы могли бы сделать следующее для первого метода, так как вы в основном тестируете, чтобы увидеть, что не возникает исключение на основе того, как я прочитал ваш вопрос:

[Test]
public void TestNoExceptionIsThrownByMethodUnderTest()
{
    var CalculatedResult = new CalculatedResult();

    try
    {
        var calculatedResult = CalculatedResult.GetCalculatedDetailsById(someid);
    }
    catch (Exception ex)
    {
        check here to see what exception type is. If NotFoundException then
        Assert.Fail("NotFoundException Thrown");
        Else exception was thrown in method being called which your other method should handle
    }
}

Для вашего второго метода (GetCalculatedDetailsForEntity) можно просто запустить отдельный тест, как вы сказали.

0 голосов
/ 13 февраля 2020

Если вы используете moq framework, тогда вы можете использовать Times.Once(), or Times.Exactly(1):

например

mockContext.Verify(x => x.GetCalculatedDetailsForEntity(It.IsAny<Entity>()), Times.Once());

Ссылка: Пожалуйста, посмотрите здесь. Я надеюсь, это поможет вы!

...