0

我正在寻找一些示例代码,用于单元测试策略模式方法调用。策略模式与工厂类别单元测试

我有一个战略模式类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

这可能是更容易发布相关的代码和测试,显示你想要做什么。人们帮助会更容易。 –

+0

我不明白这些'LeaveCategoryFactory'和你的测试方法是如何相互关联的。我认为'ProRata'是一个班级?也许它实现了'ILeaveCalculation'? 尽管有一件事立即跳出来:'LeaveCategoryFactory'是静态的。当你有静态类时,测试*任何东西都是非常困难的。 –

+0

我想知道创建策略模式类实例的最佳选择。如果我使用静态启动器,我如何确保启动相关类? – Saanch

回答

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(); 

该代码验证工厂是否使用了计算结果。如果要测试结果,最好使用存根方法而不是预期并验证计算结果,而不是预期的行为。