我刚开始进行单元测试,有一个场景我不知道如何解决,而且我的解决方案感觉不对。
我有一些代码可以做某事,如果它失败,即抛出异常,异常将被捕获并记录如下。
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/