0

戦略パターン メソッド呼び出しの単体テスト用のサンプル コードを探していました。

戦略パターン クラス LeaveCalculator があり、休暇の種類に基づいて、ファクトリ クラスが特定の計算機をインスタンス化します。
単体テストの部分では、LeaveCalculator 計算メソッドを呼び出したときに、適切な Leave タイプの計算が呼び出されることを確認しようとしています。

RhinoMocks のモックに C# を使用しています。

これを行うためのコード サンプルを教えてください。

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);
}
4

1 に答える 1

2

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

このコードは、計算結果ではなく factory が使用されたことを確認します。結果をテストする場合は、Expect の代わりに Stub メソッドを使用し、期待される動作ではなく計算結果を検証することをお勧めします。

于 2013-08-23T11:09:30.093 に答える