C# 我想断言在某个类中引发了异常
我正在为我的客户机/服务器设置构建一个测试项目。我想验证测试是否在某个执行块内失败(没有要发送到的客户端,因此服务器的send()方法将引发异常)。因为我不想让测试启动客户机和服务器并让它们进行通信(我在一台机器上进行测试时遇到了问题) 如果代码到达这一行,这意味着程序的执行流只能在另一个测试的责任范围内失败。除了对抛出的异常的stacktrace执行子字符串检查之外,还有更简单的方法吗?我觉得这个方法的可扩展性不强,如果类名发生变化,就需要经常注意C# 我想断言在某个类中引发了异常,c#,unit-testing,C#,Unit Testing,我正在为我的客户机/服务器设置构建一个测试项目。我想验证测试是否在某个执行块内失败(没有要发送到的客户端,因此服务器的send()方法将引发异常)。因为我不想让测试启动客户机和服务器并让它们进行通信(我在一台机器上进行测试时遇到了问题) 如果代码到达这一行,这意味着程序的执行流只能在另一个测试的责任范围内失败。除了对抛出的异常的stacktrace执行子字符串检查之外,还有更简单的方法吗?我觉得这个方法的可扩展性不强,如果类名发生变化,就需要经常注意 是否有一种方法不需要手动检查异常的堆栈跟踪?
是否有一种方法不需要手动检查异常的堆栈跟踪?如果您使用NUnit 不使用数据注释
[Test]
public void Test_XXXXXXX
{
var yourClass = new YourClass();
Assert.That(()=>yourClass.Method(),
.Throws.Exception
.TypeOf<TypeOfYourException>
.With.Property("Message")
.EqualTo("the message you are expecting goes here")
);
}
[Test]
[ExpectedException(typeof(ExceptionType), ExpectedMessage="your message goes here!")]
public void Test_XXXXXXX
{
var yourClass = new YourClass();
// Call your method in a way that it will fail
yourClass.YourMethod();
}
这个类中的异常除了特定于那个类之外,还有什么独特之处吗 如果消息可以识别它,您可以按照其他答案所示进行测试,如果您不使用NUnit,也可以这样测试:
try {
myMethod();
Assert.Fail("Expected exception to be thrown.");
} catch (MyException ex) {
Assert.Equals("My Exception Message", ex.Message, "Exception message was formatted incorrectly.");
} catch (Exception) {
Assert.Fail("An exception was thrown, but of the wrong type.");
}
当您对某个类进行单元测试时,有两个异常源:
正如您所看到的,我们也不关心异常的stacktrace,它会抛出我们的依赖项。它也可以是更低级异常的包装器。服务的预期行为-如果未找到配置,则引发高级初始化异常。我们正在验证该行为。检查是否引发异常是一个好主意。检查它是否是从特定方法中抛出的是一个坏主意。那就是测试一个实现细节。测试一个实现细节不是一个好主意-当你改变实现时会发生什么?@John Saunders:约翰,我认为测试一个实现细节是不是一个好主意取决于你在做什么。如果我开发了一个库(假设我实现了dictionary类),并且我的架构师告诉我,如果条目已经存在,他希望add方法有一个异常,那么我必须在单元测试中包含这个异常。另一方面,如果产品管理部门说,当用户名为空时,他们预期会出现错误,那么我是否会在模型类中使用异常或其他内容来管理该错误,将保留一个实现细节,并且可以更改。对于第二种情况,我同意你的看法。
StockService service = new StockService();
Assert.Throws<ArgumentNullException>(() => service.Connect(null));
var configMock = new Mock<IStockServiceConfig>();
configMock.Setup(c => c.Load()).Throws<FileNotFoundException>();
StockService service = new StockService(configMock.Object);
service.Connect("google");
configMock.VerifyAll();
Assert.That(service.Port, Is.EqualTo(80));
var configMock = new Mock<IStockServiceConfig>();
configMock.Setup(c => c.Load()).Throws<FileNotFoundException>();
StockService service = new StockService(configMock.Object);
Assert.Throws<StockServiceInitializationException>(_ => service.Connect("bing"));
configMock.VerifyAll();