有没有一种方法可以测试xUnit测试中是否引发并捕获了异常



我有一个try-catch块,它具有以下结构,我需要对其进行单元测试。我试图验证记录器是否调用了LogError方法,但事实证明这很困难,所以我想知道是否有办法查看是否引发并捕获了异常?

try
{
bool messageProcessed = ProcessMessage(sbMessage);
if (!messageProcessed)
{
throw new Exception();
}
}
catch (Exception ex)
{
_logger.LogError("Message could not be processed");
}

不,没有简单的方法来检查异常是否被抛出和捕获,即使在哪里,它也可能非常脆弱,因为异常通常被视为内部实现细节。

正确的方法应该是检查是否已经编写了日志消息(如果需要的话(。如果您注入记录器,这应该相当容易,如果您使用的日志框架建议为记录器使用静态构造函数,则可以支持可选注入,例如:

public class MyClass{
private static readonly ILogger DefaultLogger = CreateStaticLogger();
private ILogger _logger;
public MyClass() :this(DefaultLogger){}
public MyClass(ILogger logger) => _logger = logger;

一旦可以注入记录器,就可以使用常规类对其进行模拟,也可以使用模拟框架。无论哪种方式,您都应该能够验证是否调用了LogError-方法。如果你仍然有问题,我建议你在尝试时发布一个新问题。

您还可以考虑您的类是否应该让外部世界了解异常,而不是日志记录?是否应该重新抛出异常?如果出现故障,是否应该引发事件?也许是柜台?

最新更新