单元测试一个方法调用同一类中的另一个方法

时间:2020-02-13 01:27:43

标签: unit-testing .net-core mocking moq xunit.net

我在一个类上有两个公共方法,两者都从外部代码调用,但是其中一个方法也调用另一个。我想对一个方法进行单元测试,然后验证它是否在同一类中调用了另一个公共方法,然后我将进行单独的测试以测试另一个方法。结构看起来像这样:

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,但是我不想验证它是否已完成GetCalculatedDetailsForEntity中的所有逻辑,因为我已经在其他地方进行了测试。

是否可以仅针对GetCalculatedDetailsForEntity测试来模拟GetCalculatedDetailsById,以便我可以验证它是否按预期被调用?

我的技术堆栈是.NET Core,XUnit和Moq。

1 个答案:

答案 0 :(得分:1)

您可以对第一种方法执行以下操作,因为您基本上正在测试,以根据我对问题的理解方式,不会抛出异常:

[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)可以像您所说的那样运行单独的测试。