gpt4 book ai didi

c# - 如何对 try 主体中具有系统调用的异常处理程序进行单元测试?

转载 作者:行者123 更新时间:2023-11-30 20:45:59 25 4
gpt4 key购买 nike

 public static string GetComputername() {
try {
return Environment.MachineName;
} catch {
return string.Empty; // make sure this never ever fails
}
}

我面临着对上述代码进行单元测试的问题。强制系统从 Environment 调用中抛出异常有什么神奇之处吗?我可以对方法进行更改,以便获得所需的覆盖范围,但我对此也不太确定...有什么想法吗?

最佳答案

回答这个问题有几个方面:

  1. 白盒测试

如果您真的想确保控制流按预期工作,则必须将环境包装在一个带有接口(interface)的单独类中。如果这样做,您可以 Mock 掉 'MachineName '调用并模拟正常和错误行为。这种形式的测试非常接近代码,如果实现中的一些小事情发生变化,则需要花费大量精力进行维护。

  1. 单元测试

在这里你想从外部测试方法的行为(而不是逐行测试)如果你这样做你会发现很难测试错误情况,因为静态调用是不可模拟的......你可能想测试正常情况,而在其他情况下......那又怎样(你的决定)

  1. 集成测试

只有当一般的东西按预期工作时(“在使用它的函数中返回了某种名称”),您才真正不会在意实现细节。

第一部分需要付出很多努力,因为您需要包装所有内容,在这种情况下,对于这个简单的代码来说,工作量似乎有点大。但是您需要决定要编写测试的粒度级别对于...

这将是包装器:

public interface ISystemWrapper
{
string MachineName();
}

public class SystemWrapper : ISystemWrapper
{
public string MachineName()
{
return Environment.MachineName;
}
}

您可以像这样修改类:

public class ToTest
{
public static ISystemWrapper SysWrapper = new SystemWrapper();

public static string GetComputername()
{
try
{
return SysWrapper.MachineName();
}
catch
{
return string.Empty; // make sure this never ever fails
}
}
}

然后在您的测试中模拟 SysWrapper

关于c# - 如何对 try 主体中具有系统调用的异常处理程序进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27509620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com