我必须测试几个具有非常相似功能的不同类。
它们都注入了不同的接口,并且所有这些接口都有一个或多个具有此签名的方法:
字符串 DoSomething1(字符串);
很多被测试的类都会调用这些接口方法,我需要测试它们如何响应返回null、空字符串和抛出异常。即,如果它只有一个类,我会进行这个测试:
//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);
现在,我在 ICarDBCorrector 中还有 2 个这样的方法,我不想重复测试代码。
此外,我还有一些其他的 ComponentCorrector 类,它们使用类似的 IDbXXX 接口来完成它们的工作。
所以,我正在考虑创建一些通用方法,它可以返回正确的存根模拟以供使用,但我不知道该怎么做。
即我想要类似的东西:
T PrepareNullEmptyThrowCorrector<T>(Action<T> action)
{
T mock = MockRepository.GenerateMock<T>();
mock.Stub(with null).Return(null)
///etc.
return mock;
}
知道如何解决这个问题吗?
谢谢
更新:我找到了一些解决我的问题的方法。但为了得到更“科学”的答案,我更喜欢用通用方法的解决方案来回应,正如我最初打算的那样。只是好奇。我会将“已接受答案”标记从我的答案更改为任何其他标记,这提供了另一个有趣的解决方案。