Я только начинаю с модульного тестирования и у меня есть сценарий, я не знаю, как его оценить, и мое решение не подходит.
У меня есть немного кода, который что-то делает, если он терпит неудачу, то есть выдает исключение, исключение перехватывается и регистрируется, как показано ниже.
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. Тем не менее, это не кажется правильным, когда нужно поймать исключение? Я помню, читал что-то, что это плохо, чтобы попробовать ловит в тестах? Есть ли другой способ выполнить этот тест, или я должен рефакторинг логики? Любые идеи будут великолепны!
[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();
}
EDIT
Используя ответ Марка Рушакова, тест становится и работает как шарм.
[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();
}