有一个单元测试检查在某些情况下会抛出异常,理论上可以有几个这样的异常,它们在消息属性的值上有所不同。有一个想法是检查message的值。这是一个好主意吗?会不会导致未来出现一些不可预知的转折,影响测试的可维护性等?他们真的这样做吗?
测试方法示例:
public void SomeTestMethod(string input)
{
if (string.IsNullOrEmpty(input))
{
throw new BadRequestException("не указано значение параметра input");
}
if (input.Contains("drop"))
{
throw new BadRequestException("параметр input содержит недопустимый аргумент");
}
}
测试:
[Fact]
public void SomeTestMethod_EmptyInput_ThrowException()
{
// Act & Assert
var exception = Assert.Throws<BadRequestException>(() => Sut.SomeTestMethod(string.Empty));
Assert.Equal("не указано значение параметра input", exception.Message);
}
[Fact]
public void SomeTestMethod_EmptyInput_ThrowException()
{
// Act & Assert
var exception = Assert.Throws<BadRequestException>(() => Sut.SomeTestMethod("drop"));
Assert.Equal("параметр input содержит недопустимый аргумент", exception.Message);
}
如果有例外有什么区别?实际上测试是对某些动作、功能的测试。如果一个动作的结果是异常,那为什么不测试呢?异常不是错误,而是预期的操作,其含义是避免无休止的检查,而不是跳过它后面的代码块,以避免在操作过程中出现问题。检查我们的预期行为是正常的。将来是否会出现问题,从您正在测试异常这一事实来看,这是一项有关原则的任务。如果您遵循它们,那么理论上您应该没有问题
我不支持检查
exception.Message测试。至少因为在某些标准例外中,如果没有明确指定message,Message 属性的值将取决于启动测试的进程的文化(对于英语 - 会有一条英语消息,对于俄语 - 俄语, ETC。)。有时我会采用这种方法(检查exception.Message),但我仍然试图避免它。在您提供的代码中,我看到一个逻辑 - 输入参数无效,因此测试将失败并出现 BadRequestException。从这个角度来看,测试测试可能如下所示:
如果您仍然需要明确区分这两种情况(“空值”和“无效值”),那么您可以
exceptions为每种情况创建单独的情况,并且在测试中您已经可以捕获两种不同类型的异常。