2016-08-23 18 views
1

私はMOQにはかなり新しく、今学習中です。私はユニットテストを書く必要があるが、私は見つけることができなかった以下のエラーが出ている。誰か助けてください。テストケースに変更が必要な場合は、コードを見直してアドバイスをお願いします。MOQ例外がユーザーによって処理されていません

Expection:呼び出しが厳格なモック行動で失敗しましたIAcronisService.GetActivitiesFromDate( "MYGROUP"、2016年5月24日 八時33分34秒PM)..... ため

保存この方法は、

Processメソッドの呼び出しは、保存方法(私は例外がスローされた保存方法でコメントしています)

public int Process() 
{ 
    AcronisService = AcronisSvcManager.Get(ClientFactory, DataProviderFactory, LogAdapter); 

    DataObject backupGroupsDO = GetListOfAllCurrentGroups(); 

    int activitiesSavedCount = Save(backupGroupsDO); 
    return activitiesSavedCount; 
} 

上記の処理方法の最初の行にマウスを重ねると、デバッグ時に次の行も表示されます。私はサービスオブジェクトが呼び出されていないと思っています。上記の例外と何か関係はありますか?いくつか変更を提案してください。

(IAcronisServiceProxy)AcronisService).AcronisURLは、MOQ.MockException型の例外をスローしました。

保存方法

private int Save(DataObject backupGroupsDO) 
{ 
    int count = 0; 

    foreach (DataRecord dr in backupGroupsDO.DataRecord) 
    { 
     BackupGroup backupGroup = new BackupGroup(dr); 

     // Get all activities for each group 
     AcronisClient.DataModel.Activity.ActivitiesResponse acronisActivities; 
     if (backupGroup.LastActivityDate == null) 
     { 
      // Get all activities for each group 
      ***//Got Exception at this line*** 
      acronisActivities = AcronisService.GetActivitiesFromDate(backupGroup.GroupName, DateTime.Now.AddDays(-90)); 
     } 
     else 
     { 
      acronisActivities = AcronisService.GetActivitiesFromDate(backupGroup.GroupName, backupGroup.LastActivityDate); 
     } 



     if (acronisActivities == null || acronisActivities.Activities == null) 
     { 
      // Stop processing b/c might be an issue with the connection to Acronis 
      LogAdapter.LogError(KCBLog.Main, "Stopped processing activities, possible Acronis connection issue with getting Activities"); 
      return -1; 
     } 
     var lastBackUpActivity = acronisActivities.Activities.OrderByDescending(z => z.StartTime).FirstOrDefault(); 

     List<string> lastSuccessfulActivities = new List<string>(); 
     List<string> lastActivities = new List<string>(); 

     foreach (var acronisActivity in acronisActivities.Activities) 
     { 

      Kaseya.KCB.Common.DataModels.AcronisActivity activity = new AcronisActivity(); 
      activity.BackupPlanId = acronisActivity.BackupPlanId; 
      activity.BytesProcessed = acronisActivity.BytesProcessed; 
      activity.BytesSaved = acronisActivity.BytesSaved; 


      activity.Cause = acronisActivity.CompletionResult == null ? null : acronisActivity.CompletionResult.Cause; 
      activity.Reason = acronisActivity.CompletionResult == null ? null : acronisActivity.CompletionResult.Reason; 
      activity.Effect = acronisActivity.CompletionResult == null ? null : acronisActivity.CompletionResult.Effect; 

      activity.DateCreated = DateTime.Now; 

      activity.FinishTime = acronisActivity.FinishTime; 
      activity.GroupId = backupGroup.Id; 
      activity.Id = acronisActivity.Id; 
      activity.InitiatedBy = acronisActivity.InitiatedBy; 
      activity.InstanceId = acronisActivity.InstanceId; 
      activity.IsRootActivity = (bool)acronisActivity.IsRootActivity; 
      activity.ParentActivityId = acronisActivity.ParentActivityId; 
      activity.PartitionId = PartitionId; 
      activity.StartTime = acronisActivity.StartTime; 
      activity.State = acronisActivity.State; 
      activity.Status = acronisActivity.Status; 
      activity.Title = acronisActivity.Title; 
      activity.UpdateTime = acronisActivity.UpdateTime; 

      AcronisActivityDataProvider.AddUpdateAcronisActivity(activity); 

      AcronisClient.DataModel.Activity.Activity lastSuccessfulActivity = acronisActivities.Activities.Where(z => z.Status == "ok" && z.Title.Contains("Running backup plan") && z.InstanceId==acronisActivity.InstanceId).OrderByDescending(z => z.FinishTime).FirstOrDefault(); 
      var lastActivity = acronisActivities.Activities.Where(z => z.Title.Contains("Running backup plan") && z.InstanceId == acronisActivity.InstanceId).OrderByDescending(z => z.FinishTime).FirstOrDefault(); 


      if (!string.IsNullOrEmpty(acronisActivity.InstanceId)) 
      { 
       DataRecord assetDR = AssetDataProvider.GetByInstanceId(acronisActivity.InstanceId, PartitionId); 
       if (assetDR != null) 
       { 
        var assetId = assetDR.FindValue<string>("id", ""); 

        if (lastSuccessfulActivity != null && !lastSuccessfulActivities.Contains(acronisActivity.InstanceId)) 
        { 
         AssetDataProvider.UpdateLastSuccessfulActivityId(assetId, lastSuccessfulActivity.ParentActivityId); 
         lastSuccessfulActivities.Add(acronisActivity.InstanceId); 
        } 
        if (lastActivity != null && !lastActivities.Contains(acronisActivity.InstanceId)) 
        { 
         AssetDataProvider.UpdateLastActivityId(assetId, lastActivity.ParentActivityId); 
         lastActivities.Add(acronisActivity.InstanceId); 
        } 
       } 
      } 
      count++; 
     } 

     if (acronisActivities.Activities != null && acronisActivities.Activities.Count>0) 
     { 
      //backupGroup.LastActivityDate = lastBackUpActivity.StartTime; 
      BackupGroupDataProvider.UpdateLastBackupGroupActivityDate(backupGroup.Id, lastBackUpActivity.StartTime); 
     } 
    } 

    return count; 
} 

試験方法私はあなたの例から、

public void Test() 
{ 
    string groupName = "mygroup"; 
    string mybackupAccountName = "mybackupaccount"; 
    decimal PartitionId = 9m; 
    DateTime lastActivityDate = DateTime.Parse("2016-08-14T20:47:05"); 
    string instanceId = "utinstanceId"; 
    string assetId = "123"; 


    DataRecord asset = new DataRecord(); 
    asset.AddField("id", 123); 

    DataObject backupGroupsDO = new DataObject(); 
    DataRecord groupDataRecord = new DataRecord(); 
    groupDataRecord.AddField("id", 123); 
    groupDataRecord.AddField("partitionId", PartitionId); 
    groupDataRecord.AddField("groupName", groupName); 

    //groupDataRecord.AddField("lastActivityDate", lastActivityDate); 

    groupDataRecord.AddField("backupAccountName", mybackupAccountName); 
    backupGroupsDO.DataRecord.Add(groupDataRecord); 

    AcronisActivity acronisActivity = new AcronisActivity(); 
    acronisActivity.BackupPlanId = "utBackupPlanId"; 

    ActivitiesResponse activitiesResponse = new ActivitiesResponse(); 
    AcronisClient.DataModel.Activity.Activity activity = new AcronisClient.DataModel.Activity.Activity(); 
    activity.BackupPlanId = "utackupPlanId"; 
    activity.BytesProcessed = 124674; 
    activity.BytesSaved = 06446; 
    activity.CompletionResult = new CompletionResult() 
    { 
     Cause = "utCause", 
     Reason = "utReason", 
     Effect = "utEffect" 
    }; 
    activity.FinishTime = DateTime.Parse("2016-08-14T20:47:04"); 
    activity.Id = "utId"; 
    activity.InitiatedBy = "utInitiatedBy"; 
    activity.InstanceId = "utInstanceId"; 
    activity.IsRootActivity = true; 
    activity.ParentActivityId = "utParentActivityId"; 
    activity.StartTime = DateTime.Parse("2016-08-14T20:47:02"); 
    activity.State = "utState"; 
    activity.Status = "utStatus"; 
    activity.Title = "utTitle"; 
    activity.UpdateTime = DateTime.Parse("2016-08-14T20:47:03"); 

    activitiesResponse.Activities = new List<AcronisClient.DataModel.Activity.Activity>(); 
    activitiesResponse.Activities.Add(activity); 

    var moqFactory = new MockRepository(MockBehavior.Strict); 

    var moqDataProviderFactory = moqFactory.Create<IDataProviderFactory>(); 
    var moqDataProvider = moqFactory.Create<IDataProvider>(); 
    var moqLogAdapter = moqFactory.Create<ILogAdapter>(); 
    var moqAcronisServiceManager = moqFactory.Create<IAcronisServiceManager>(); 
    var moqAcronisService = moqFactory.Create<IAcronisService>(); 
    var moqAssetDataProvider = moqFactory.Create<IAssetDataProvider>(); 
    var moqAcronisActivityDataProvider = moqFactory.Create<IAcronisActivityDataProvider>(); 
    var moqBackupGroupDataProvider = moqFactory.Create<IBackupGroupDataProvider>(); 


    Credential MSPCredential = new Credential(); 

    moqDataProviderFactory.Setup(m => m.BackupGroupDataProvider.GetBackupGroups()).Returns(backupGroupsDO); 

    moqAcronisServiceManager.Setup(m => m.Get(It.IsAny<IRestClientFactory>(), It.IsAny<IDataProviderFactory>(), It.IsAny<ILogAdapter>(), "")).Returns(moqAcronisService.Object); 

    moqDataProvider.Setup(m => m.VerifyPartitionId(ref PartitionId)); 
    moqDataProvider.Setup(m => m.ExecuteNonQuery(It.IsAny<AddUpdateAcronisActivity>())).Returns(1); 
    moqAcronisService.Setup(m => m.GetActivitiesFromDate(groupName, lastActivityDate)).Returns(activitiesResponse); 
    moqAcronisActivityDataProvider.Setup(m => m.AddUpdateAcronisActivity(acronisActivity)); 
    moqAssetDataProvider.Setup(m => m.GetByInstanceId(instanceId, PartitionId,1)).Returns(asset); 
    moqAssetDataProvider.Setup(m => m.UpdateLastActivityId(assetId, activity.ParentActivityId)); 
    moqAssetDataProvider.Setup(m => m.UpdateLastSuccessfulActivityId(assetId, activity.ParentActivityId)); 
    moqBackupGroupDataProvider.Setup(m => m.UpdateLastBackupGroupActivityDate("1234", lastActivityDate)); 

    // moqAcronisService.Setup(m => m.GetActivitiesFromDate(groupName, Convert.ToDateTime("2016-08-18T13:18:40.000Z"))).Returns(activitiesResponse); 


    ActivityHarvester activityHarvester = new ActivityHarvester(); 

    activityHarvester.PartitionId = PartitionId; 
    activityHarvester.DataProvider = moqDataProvider.Object; 
    activityHarvester.LogAdapter = moqLogAdapter.Object; 
    activityHarvester.AcronisSvcManager = moqAcronisServiceManager.Object; 
    activityHarvester.DataProviderFactory = moqDataProviderFactory.Object; 
    activityHarvester.AcronisService = moqAcronisService.Object; 
    activityHarvester.AssetDataProvider = moqAssetDataProvider.Object; 
    activityHarvester.BackupGroupDataProvider = moqBackupGroupDataProvider.Object; 
    activityHarvester.AcronisActivityDataProvider = moqAcronisActivityDataProvider.Object; 


    activityHarvester.process();//*process method calls above save method method* 
    moqFactory.VerifyAll(); 
} 
+0

テストしようとしていることは(少なくとも私には)明確ではありません。ヒントはほとんどありません。いくつかの[テスト命名規則](http://stackoverflow.com/questions/155436/unit-test-naming-best-practices)を使用してください。 UnitTestメソッドでコードを整列して書式設定するには、[Arrange-Act-Assert](http://c2.com/cgi/wiki?ArrangeActAssert)パターンを使用します。エラーのために外観があります。 [ここ](http://stackoverflow.com/questions/11989717/all-invocation-on-the-mock-must-have-a-corresponding-setup)。 – dee

+0

[模擬動作で厳密な呼び出しで失敗したMoq.Mock Exceptionの重複](http://stackoverflow.com/questions/38579512/moq-mock-exception-with-invocation-failed-with-mock-behavior-strict) – Nkosi

答えて

1

をwritternている、IAcronisService.GetActivitiesFromDateためのセットアップは、それがコードに基づいて2016-08-14T20:47:05lastActivityDateを期待していることを示していますエラーは、異なる日付の5/24/2016 8:33:34 PMを予想よりも使用したことを示しています。 moqの振る舞いがStrictであるため、

対応するセットアップがない呼び出しに対して、モックは常に例外をスローします。

あなたはIt.IsAny<DateTime>()

moqAcronisService 
    .Setup(m => m.GetActivitiesFromDate(groupName, It.IsAny<DateTime>())) 
    .Returns(activitiesResponse); 

またはDefaultまたはLoose MockBehaviorを使用するようにMOQ工場での挙動を変更するを使用して、セットアップがもう少し柔軟にすることができます。

+0

ありがとうございます。それは動作します。私は同じエラーに苦しんでおり、私は同じ戦略を適用しました。ありがとうございました – crony

+0

おかげで。喜んで助けてください。これで問題が解決された場合は、忘れずに回答としてマークしてください。 – Nkosi

+0

同じテスト方法のために、If条件をカバーしました。しかし、私はelse条件をカバーする必要があり、私は何をすべきか知っています。 nullを送信するのではなく、単に値を渡す必要があります。 else条件に移ります。そのためには、1行追加/値の割り当てと同じテスト方法を書く必要があります。私の質問は、同じ行のテストメソッドを1行だけ書くのではなく、外部からの価値を渡す方法はありますか? – crony

関連する問題