0

在浏览我的应用程序代码时,我遇到了这个问题:

private string[] ReadFromFile(string path)
{
    string[] data = null;
    try
    {
        data = File.ReadAllLines(path);
    }
    catch (Exception)
    {
        throw new Exception("The file is not correct");
    }

    return data;
}

好的,所以我知道这段代码不好,我正要重构它。但是,此代码用于 FitNesse 的某些测试的定义中。此代码从未在生产中使用。此方法中给出的参数应该始终正确。所以我想删除整个 try/catch 块,如果它应该让它崩溃。FitNesse 会给我们关于抛出异常的全部细节,但由于它是一个测试夹具,我想知道它是否可以

File.ReadAllLines可以抛出十几个不同的异常。

所以我的问题是:在生产环境之外拥有这样的代码是否可以接受,即使用于测试生产代码,并且在受控制的环境中?还是在任何情况下都不好?

4

3 回答 3

2

在单元测试中使用这样的代码比在生产代码中使用更糟糕。在生产代码中,有时隐藏一些异常细节可能是有意义的(尽管它们仍然应该通过InnerException例如交付)但在单元测试中你应该总是尽可能多地看到,因为它们是为完成的(开发人员,而不是最终用户) . 所以我认为应该删除整个 try/catch 块。

此外,如果在其他情况下您希望测试失败,那么我建议使用Assert.Fail("message")构造,因为它更清楚,如果达到这一点,测试应该被视为失败。不确定它是否可以应用于 FitNesse。

于 2012-08-03T08:18:54.347 回答
1

我会抓住它,然后抛出一个简化的异常,该异常将利用 FitNesse 的功能

private string[] ReadFromFile(string path)
{
    string[] data = null;
    try
    {
        data = File.ReadAllLines(path);
    }
    catch (Exception)
    {
        throw new Exception("message:<<Problem reading in file: " +e.getMessage() + ">>");
    }

    return data;
}

如果您这样做,错误消息将出现在上下文中并且更容易识别。不幸的是,未包装的异常将出现在与有问题的夹具分开的异常块中。e.printStackTrace() 将在输出页面上为您提供可以为您提供更多详细信息的信息。

我同意其他人的观点,即在单元测试代码中,您希望异常发生在代码的上下文中。但是,在单元测试中,您的受众是不同的。与它一起工作的人应该始终是开发人员。对于 FitNesse 测试,您正在与 BA 和测试人员合作,他们可能会从一些额外的诊断中受益。

我添加的代码是 Java,我知道这是 ac# 测试,但精神是相同的,“消息:<< 异常”在 FitSharp 中应该同样适用于 slim。我在 Java 和 ruby​​ 中工作,所以我的 c# 真的很弱。

于 2012-08-03T16:01:06.317 回答
0

如果你捕捉到异常,你应该对它做点什么,写日志,例如如果你只抛出你自己的异常,你会丢失最后一个异常的堆栈跟踪。

于 2012-08-03T08:16:17.170 回答