单元测试一个方法调用同一个方法中的另一个方法 Class
Unit Testing One Method Calls Another Method in the Same Class
我在 class 上有两个 public 方法,它们都是从外部代码调用的,但其中一个方法也调用另一个方法。我想对一个方法进行单元测试,并验证它在同一个 class 中调用另一个 public 方法,然后我将进行单独的测试来测试另一个第二种方法。结构看起来像这样:
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
,我会模拟依赖项,验证它们是否被正确调用,验证缓存是否设置正确,验证 return 值是给定提供的输入和模拟的预期值值。
对于 GetCalculatedDetailsById
我会模拟存储库依赖项,测试它是否按预期调用了 GetEntity
,并在必要时抛出异常。然后我想验证它使用预期的实体对象调用 GetCalculatedDetailsForEntity
,但我不想验证它执行 GetCalculatedDetailsForEntity
中的所有逻辑,因为我已经在别处测试了。
是否可以为 GetCalculatedDetailsById
测试模拟 GetCalculatedDetailsForEntity
,以便我可以验证它是否按预期被调用?
我的技术堆栈是 .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.希望对您有所帮助!
我在 class 上有两个 public 方法,它们都是从外部代码调用的,但其中一个方法也调用另一个方法。我想对一个方法进行单元测试,并验证它在同一个 class 中调用另一个 public 方法,然后我将进行单独的测试来测试另一个第二种方法。结构看起来像这样:
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
,我会模拟依赖项,验证它们是否被正确调用,验证缓存是否设置正确,验证 return 值是给定提供的输入和模拟的预期值值。
对于 GetCalculatedDetailsById
我会模拟存储库依赖项,测试它是否按预期调用了 GetEntity
,并在必要时抛出异常。然后我想验证它使用预期的实体对象调用 GetCalculatedDetailsForEntity
,但我不想验证它执行 GetCalculatedDetailsForEntity
中的所有逻辑,因为我已经在别处测试了。
是否可以为 GetCalculatedDetailsById
测试模拟 GetCalculatedDetailsForEntity
,以便我可以验证它是否按预期被调用?
我的技术堆栈是 .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.希望对您有所帮助!