Мне нужно протестировать несколько разных классов с очень похожей функциональностью.
Все они вводятся с разными интерфейсами, и все эти интерфейсы имеют один или несколько методов с этой сигнатурой:
stringDoSomething1 (string);
Многие из тестируемых классов будут вызывать эти методы интерфейса, и мне нужно проверить, как они реагируют на возвращение пустой, пустой строки и выбрасывающего исключения.Т.е. если бы это был только один класс, у меня был бы этот тест:
//arrange
CarComponentType carNull = new CarComponentType();
carNull.VendorCode = RESPONSE_NULL_CODE;
CarComponentType carEmpty = new CarComponentType();
carEmpty.VendorCode = RESPONSE_EMPTY_CODE;
CarComponentType carEx = new CarComponentType();
carEx.VendorCode = RESPONSE_EXCEPTION;
ICarDBCorrector dbCar = MockRepository.GenerateMock<ICarDBCorrector>();
dbCar
.Stub(d => d.GetCarVendorByCode(RESPONSE_NULL_CODE))
.Return(null);
dbCar
.Stub(d => d.GetCarVendorByCode(RESPONSE_EMPTY_CODE))
.Return(String.Empty);
dbCar
.Stub(d => dbCar.GetCarVendorByCode(RESPONSE_EXCEPTION))
.Throw(new Exception());
CarComponentCorrector corrector = new CarComponentCorrector(dbCar);
//act
corrector.CorrectComponent(carNull);
corrector.CorrectComponent(carEmpty);
corrector.CorrectComponent(carEx);
//assert
Assert.AreEqual(RESPONSE_NULL_CODE, carNull.VendorName);
Assert.AreEqual(RESPONSE_EMPTY_CODE, carEmpty.VendorName);
Assert.AreEqual(RESPONSE_EXCEPTION, carEx.VendorName);
Теперь у меня есть еще 2 таких метода в ICarDBCorrector, и я предпочел бы не дублировать код тестирования.
Кроме того, у меня есть несколько других классов ComponentCorrector, которые используют аналогичные интерфейсы IDbXXX для своей работы.
Итак, я думал о создании какого-то универсального метода, который может возвращать правильный заглушенный макет, ноЯ не могу понять, как именно это сделать.
Т.е. мне бы хотелось что-то вроде:
T PrepareNullEmptyThrowCorrector<T>(Action<T> action)
{
T mock = MockRepository.GenerateMock<T>();
mock.Stub(with null).Return(null)
///etc.
return mock;
}
Есть идеи, как к этому подойти?
Спасибо
ОБНОВЛЕНИЕ: Я нашел решение своей проблемы.Но чтобы получить более «научный» ответ, я бы предпочел ответ с решением для универсального метода, как я изначально предполагал.Просто любопытно.Я поменяю отметку «принятый ответ» с моего ответа на любой другой, который предлагает другое интересное решение.