如何测试仅在系统路径错误时抛出的异常?

时间:2009-08-23 06:47:23

标签: .net nunit path system exception

我在C#中有以下类,它从propriatery .DLL创建一个对象,在初始化时需要在可访问目录中有许可证。

public CplexServices{
    private Cplex _cplex;
    public Cplex Cplex { get { return _cplex; } }
    public CplexServices()
    {
        try
        {
            _cplex = new Cplex();
        }
        catch
        {
            throw new Exception("Path or license file is wrong");
        }
    }
}
如果Windows系统路径错误或许可证文件不正确,

“new Cplex()”可能会失败。我想写一个测试来断言当路径和/或许可证文件错误时是否抛出了正确的异常。

如何在不更改路径或许可证文件的情况下编写此测试?

3 个答案:

答案 0 :(得分:1)

你做不到。您需要为文件设置错误位置,并确认您获得了异常。

但可能这不是你单元测试的东西,因为决定失败的代码不适合你。

我假设你在配置中设置了这个文件的位置?然后你需要测试那个位置是否正确;但是考虑到如果你有多个部署和不同的配置,你需要在适当的环境下运行你的测试。

答案 1 :(得分:1)

您可以使用

string oldPath = Environment.GetEnvironmentVariable("PATH");
Environment.SetEnvironmentVariable("PATH", "MyBadPath");
// Do tests
Environment.SetEnvironmentVariable("PATH", oldPath);

要测试路径问题,请输入错误的路径。要测试许可证文件,请输入包含错误许可证文件的测试目录的路径。

答案 2 :(得分:1)

你在测试什么?我相信您正在测试对新Cplex()的调用的错误处理路径是否正确。

public CplexServices()
{
    try
    {
        _cplex = new Cplex();
    }
    catch
    {
        throw new Exception("Path or license file is wrong");
    }
}

你不是新的Cplex()本身,它会在缺少许可证文件时抛出异常,而是在测试如果它会抛出异常你做对了。在这种情况下,它是如此简单,以至于我可能不会太在意。但是,如果这更复杂,例如一些严肃的恢复处理,那么我们更愿意能够测试它。

一种方法,通过工厂。

public CplexServices(CplexFactory myFactory)
{
    try
    {
        _cplex = myFactory.makeCplex();
    }
    catch
    {
        throw new Exception("Path or license file is wrong");
    }
}

现在,在您的测试中,您可以通过一个工厂,该工厂可以明确地抛出触发您要测试的路径的异常。

这仍然留下了如何测试Cplex()构造函数本身的问题。可以说这不是你的问题,作者应该有自己的单元测试。