unit-testing - 抛出异常后的单元测试行为?

标签 unit-testing exception-handling tdd nunit rhino-mocks

我刚开始进行单元测试,有一个场景我不知道如何解决,而且我的解决方案感觉不对。

我有一些代码可以做某事,如果它失败,即抛出异常,异常将被捕获并记录如下。

 public T CreateTypedObjectInstance<T>()
 {
     T o = default(T);
     try
     {
         o = Activator.CreateInstance<T>();
     }
     catch (Exception ex)
     {
         LogError(ex);
         throw ex;
     }
     return o;
 }

 private void LogError(Exception ex)
 {
     if (logger != null)
     {
        logger.LogError(ex);
     }
 }

我想测试如果抛出错误,它会调用 LogError() 方法,该方法又会调用另一个对象。

我已经使用模拟记录器来处理这个问题,并捕获第一个抛出的异常,然后断言调用了 LogError 方法。但是,这感觉不需要捕获异常是正确的吗?我记得读过一些东西,在测试中 try catch 是不好的?有没有其他方法来执行这个测试或者我应该重构逻辑?任何想法都会很棒!

      [Test]
    public void CreateTypedObjectInstance_GivenTypeWithoutPrivateContructor_LogErrorToLogger()
    {
        //Setup Method used
        MockRepository mockery = new MockRepository();
        ILogger mockedLogger = mockery.StrictMock<ILogger>();
        genericObjectFactoryInstance.Logger = mockedLogger;
        Expect.Call( delegate { mockedLogger.LogError(null); } ).IgnoreArguments();
        mockery.ReplayAll();
        // this will throw an error as String does not have a parameterless constructor
        try
        {
            genericObjectFactoryInstance.CreateTypedObjectInstance<String>();
        }
        catch { /*ignore this error to test behaviour after*/ }
        mockery.VerifyAll();
    }

编辑

使用 Mark Rushakoff 答案,测试变得像魅力一样发挥作用。

        [Test]
    public void CreateTypedObjectInstance_GivenTypeWithoutPrivateContructor_LogErrorToLogger()
    {
        //Setup Method used
        MockRepository mockery = new MockRepository();
        ILogger mockedLogger = mockery.StrictMock<ILogger>();
        genericObjectFactoryInstance.Logger = mockedLogger;
        Expect.Call( delegate { mockedLogger.LogError(null); } ).IgnoreArguments();
        mockery.ReplayAll();
        Assert.Throws<MissingMethodException>(() => genericObjectFactoryInstance.CreateTypedObjectInstance<String>());
        mockery.VerifyAll();
    }

最佳答案

您没有说明您使用的是哪个版本的 NUnit,但首选方法是 Assert.Throws方法。

Assert.Throws<YourCustomException>(() => GenericObjectFactoryInstance.CreateTypedObjectInstance<String>());

@Bruno's answer当您的测试框架不提供检查抛出异常的工具时,这是合适的。

关于unit-testing - 抛出异常后的单元测试行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3275369/

相关文章:

c# - 设置图像时参数无效

c++ - 使用 QT 窗口作为 C++ 单元测试的一部分

iphone - 测试 View 助手

c# - 为什么 DevExpress Treelist 会定期抛出 HideException?

java - 捕获java中所有抛出的异常?

c++ - 如何测试函数调用顺序

javascript - Chai断言测试对象结构是否至少包含其他对象结构

mysql - 测试驱动开发检查数据库查询所涉及的方法

ios - IOS (Swift) 中的单元测试 BLE 应用程序

unit-testing - 如何将特征对象的 stub 注入(inject) Rust 中的类型并保留对它的引用?