我在一个类上有两个公共方法,都从外部代码调用,但是其中一个方法也调用另一个。我想对一个方法进行单元测试,然后验证它是否在同一类中调用了另一个公共方法,然后我将进行单独的测试以测试另一个方法。结构看起来像这样:
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。
您可以对第一种方法进行以下操作,因为您基本上正在测试,以根据我对问题的理解方式,不会引发任何异常:
[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)可以像您所说的那样运行单独的测试。
如果使用的是moq框架,则可以使用Times.Once(), or Times.Exactly(1):
例如
mockContext.Verify(x => x.GetCalculatedDetailsForEntity(It.IsAny<Entity>()), Times.Once());
参考:请查看here.,希望对您有所帮助!