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. В вашем случае определите метод ILeaveFactoryCategory с помощью метода GetCategory. Заставьте свой класс ProRate зависимым от него (например, задайте завод по параметру конструктора). Затем издевайтесь над заводским интерфейсом, а не сами калькулятор и ожидая их. Используйте metched object в качестве параметра для тестируемого класса (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 и проверить результат вычисления вместо ожидаемого поведения.