代码之家  ›  专栏  ›  技术社区  ›  Steven Evers

使用entlib进行单元测试-不包括捕获

  •  2
  • Steven Evers  · 技术社区  · 14 年前

    我有一个方法可以执行一些IO,通常如下所示:

    public bool Foo()
    {
        try
        {
            // bar
    
            return true;
        }
        catch (FileNotFoundException)
        {
            // recover and complete
        }
        catch (OtherRecoverableException)
        {
            // recover and complete
        }
        catch (NonRecoverableException ex)
        {
            ExceptionPolicy.HandleException(ex, "LogException");
            return false;
        }
    }
    

    当我进行单元测试时,抛出其中一个异常,我得到的错误是

    Activation error occured while trying to get instance of type ExceptionPolicyImpl
    

    为了获得实际的/原始的异常信息,而不是EntLib无法记录(实际上,要强制不可恢复的异常并进行[ExpectedException(typeof(NonRecoverableException))]单元测试,以确保该方法符合规范,我想抑制这种情况。

    我该怎么办?

    使用预处理器指令并不理想,因为我讨厌在代码库中看到特定于测试的代码。

    2 回复  |  直到 14 年前
        1
  •  10
  •   Chris Tavares    14 年前

    使用Entlib静态外观的代码的可测试性是困难的。在不改变代码的情况下,唯一的答案就是添加一个app.config 将文件保存到测试程序集,并使用不起任何作用的无害策略设置Entlib异常块。

    然而,在entlib4(和5,我看到您正在使用)中有另一种方法。我们专门为所有块添加了一个实例入口点,以提高可测试性。对于异常块,该实例是ExceptionManager。使用它非常简单。将异常管理器实例放入您的类型中,然后调用它而不是ExceptionPolicy。像这样:

    public class Whatever {
        private ExceptionManager exm;
    
        public Whatever(ExceptionManager exm) { this.exm = exm; }
    
        public bool Foo() {
            try {
                ... do whatever ...
            }
            catch(NonRecoverableException ex) {
                exm.HandleException(ex, "LogException");
                return false;
            }
        }
    }
    

    现在您已经有了它,您可以模拟ExceptionManager(它是一个抽象基类),以便在测试期间基本上不操作它,可以手动操作,也可以使用模拟对象框架。

    public class Whatever {
        private ExceptionManager exm;
    
        public Whatever() : this(EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>()) { }        
        public Whatever(ExceptionManager exm) { this.exm = exm; }
    }
    

    最终用户使用默认构造函数,您的测试使用接受显式ExceptionManager的构造函数,并且您有钩子来模拟Entlib使用的任何东西。

        2
  •  1
  •   Doobi    14 年前