代码之家  ›  专栏  ›  技术社区  ›  derdo

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

  •  1
  • derdo  · 技术社区  · 15 年前

    我在C中有以下类,它从propritialy.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 回复  |  直到 15 年前
        1
  •  1
  •   djna    15 年前

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

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

    您不是在测试new cplex()本身,而是在缺少许可证文件时抛出异常,而是在测试 如果 它抛出异常,你做正确的事。在这种情况下,它是如此微不足道的正确,我可能不会太在意。但是,如果这相当复杂,例如要进行一些严重的恢复处理,那么我们更愿意测试这一点。

    一种方法,在工厂通过。

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

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

    这仍然存在这样一个问题:您如何测试cplex()构造函数本身。可以说这不是您的问题,作者应该有自己的单元测试。

        2
  •  1
  •   Noon Silk    15 年前

    你不能。你需要为文件设置一个错误的位置,并确认你得到了异常。

    但是,这可能不是你要做的单元测试,因为决定失败的代码不是由你决定的。

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

        3
  •  1
  •   Vinay Sajip    15 年前

    你可以使用

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

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