Dll,消息框和单元测试

时间:2013-01-17 15:25:49

标签: unit-testing dll messagebox

好的......我正在处理一个管理一些已配置设置的dll(我不会在这里讨论细节和推理,因为这不适用)。我有一个用于引用程序集的类,用于与此系统进行交互。这个类有一个Load()方法。当出现读取或验证错误时,我目前正在显示一个消息框。我觉得应该由引用程序集负责管理它?还是我错了?目前这正在创建单元测试的破坏,所以我正在考虑添加一个属性来抑制消息,但仍然允许抛出异常。我在另一篇文章中读到了有人建议使用IoC和对话结果助手类的帖子。插图是使用Constructor Injection ...但是这将再次将该责任交给引用程序集。在这种情况下,最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

就个人而言,我认为你错了 - 抱歉。 DLL的职责是通知错误,调用代码的责任是确定如何处理该通知。如果是GUI,则可以显示对话框。如果是单元测试,则可以进行适当的测试。如果它是一个网站,它可以用HTML将通知写出来给用户。如果它是某种服务,它可以记录它。等等。

答案 1 :(得分:0)

您可以使用委托发送要在其他地方处理的邮件。我在下面使用单元测试做了一个例子:

    public delegate void ErrorHandlingDelegate(Exception exception);  //The delegate 


    public class AsseblymRefClass //Your class doing the business logic 
    {
        public void DoStuff(ErrorHandlingDelegate errorHandling) //Passing the delegate as argument
        {
            try
            {
                //Do your stuff
                throw new Exception();
            }
            catch (Exception ex)
            {
                errorHandling(ex); //Calling the delegate
            }
        }
    }


    //Another class that can handle the error through its method 'HandleErrorsFromOtherClass()'
    public class ErrorHandlingClass
    {
        public void HandleErrorsFromOtherClass(Exception exception)
        {
            MessageBox.Show(exception.Message);
        }

    }



    [Test]
    public void testmethod() //The test that creates your class, and a class for the errorhandling, and connects the two
    {
        ErrorHandlingClass errorHandling = new ErrorHandlingClass();

        AsseblymRefClass assemblyRef = new AsseblymRefClass();

        assemblyRef.DoStuff(errorHandling.HandleErrorsFromOtherClass);
    }

可以使用任何适合委托的方法。因此,您可以使用在单元测试时未显示消息框的内容替换您的生产代码。