我正在寻找一些用于测试策略模式方法调用的单元的示例代码。
我有一个策略模式类LeaveCalculator,并根据离开类型,工厂类将实例化特定的计算器。
对于单元测试部分,我试图验证在调用LeaveCalculator计算方法时调用正确的离开类型计算。
我使用C#来嘲笑RhinoMocks。
请告诉我任何代码示例吗?
public static class LeaveCategoryFactory
{
private static List<ILeaveCalculation> categories = new List<ILeaveCalculation>();
public static ILeaveCalculation GetCategory(LeaveCalculationType calculationType)
{
if (categories.Count == 0)
{
categories = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(type => typeof(ILeaveCalculation).IsAssignableFrom(type) && type.IsClass)
.Select(type => Activator.CreateInstance(type))
.Cast<ILeaveCalculation>()
.ToList();
}
return categories.Where(x => x.CalculationType == calculationType).FirstOrDefault() as ILeaveCalculation;
}
}
[TestMethod]
public void ShouldReturnOneWhenAvailableLeaveCountIs12AndWorkedForAMonth()
{
leaveCount.StartDate = systemDateTime.Now.Date.AddMonths(-1);
leaveCount.EndDate = systemDateTime.Now.Date.AddMonths(11);
leaveCount.Count = 12;
var proRataClass = MockRepository.GenerateMock<ProRata>();
var availableLeaveCount = proRataClass.Calculate(employee, systemDateTime.Now.Date, leaveCount);
Assert.AreEqual(1, availableLeaveCount);
}
答案 0 :(得分:1)
您必须重新设计代码才能使用Dependency Injection。在您的情况下,使用GetCategory方法定义ILeaveFactoryCategory。使ProRate类依赖于它(例如,通过构造函数参数设置工厂)。然后模拟工厂界面而不是计算器本身并设置它们的期望。使用模拟对象作为被测试类的参数(LeaveCalculator)。验证对模拟对象的期望。
ILeaveCalculation expectedCalculator = new MyCalculator();
LeaveCalculationType expectedCalculationType = LeaveCalculationType.MyType;
ILeaveFactoryCategory factoryMock = MockRepository.GenerateMock<ILeaveFactoryCategory >();
factoryMock.Expect(f => f.GetCategory(Arg<LeaveCalculationType>.Is.Equal(expectedCalculationType)).Returns(expectedCalculator);
var proRataClass = new ProRata(factoryMock);
var availableLeaveCount = proRataClass.Calculate(employee, systemDateTime.Now.Date, leaveCount);
factoryMock.VerifyAllExpectations();
此代码验证工厂的使用情况不是计算结果。如果要测试结果,最好使用Stub方法而不是Expect,并验证计算结果而不是预期的行为。