2016-05-04 16 views
0

ASP.NET MVCプロジェクトを開発中です。私のプロジェクトでは、単体テストをやっています。私はビジネスロジックを模擬するためにMoqを使用しています。しかし、私はMoqに問題があります。特にmock.Verifyメソッドで。下記の私のシナリオをご覧ください。ASP.NET MVCユニットテストでMoqのスローエラーを確認する方法

これは、私はこれがあなたが私の試験方法を見ることができるように、私は確信してregionRepo.Update方法があることを確認するために確認してください使用しています私のテスト機能

[TestMethod] 
     public void Edited_And_Redirected() 
     { 
      var postFile = new Mock<HttpPostedFileBase>(); 
      postFile.Setup(m => m.ContentLength).Returns(1); 

      CreateRegionVM model = new CreateRegionVM 
      { 
       Id = 1, 
       Name = "test", 
       ImageFile = postFile.Object 
      }; 

      Mock<IRegionRepo> regionMock = new Mock<IRegionRepo>(); 
      regionMock.Setup(m => m.Update(new Region())).Verifiable(); 
      Mock<IFileHelper> fileMock = new Mock<IFileHelper>(); 
      fileMock.Setup(m => m.UploadFile(model.ImageFile, It.IsAny<String>(), null)).Returns("upload_file_path"); 

      RegionController controller = new RegionController(regionMock.Object, fileMock.Object, 0); 
      var unknownView = controller.Edit(model); 
      regionMock.Verify(); 
      Assert.IsInstanceOfType(unknownView, typeof(RedirectToRouteResult), "Not redirected"); 
     } 

ある

[HttpPost] 
     public ActionResult Edit(CreateRegionVM model) 
     { 
      if(ModelState.IsValid) 
      { 
       Region region = new Region 
       { 
        Id = model.Id, 
        Name = model.Name, 
        MmName = model.MmName, 
        Description = model.Description, 
        MmDescription = model.MmDescription, 
        GeoLocation = model.GeoLocation, 
        ImagePath = model.ImagePath 
       }; 
       String imagePath = String.Empty; 
       if(model.ImageFile!=null && model.ImageFile.ContentLength>0) 
       { 
        imagePath = fileHelper.UploadFile(model.ImageFile, AppConfig.RegionImageDir,null); 
        if(String.IsNullOrEmpty(imagePath)) 
        { 
         return new HttpStatusCodeResult(HttpStatusCode.InternalServerError); 
        } 
        else 
        { 
         //create thumb & delete old images - check the image operations 
         fileHelper.CreateThumb(imagePath, AppConfig.RegionImageDir, AppConfig.RegionMediumThumbWidth, AppConfig.RegionMediumThumbHeight, AppConfig.MediumThumbSuffix); 
         fileHelper.CreateThumb(imagePath, AppConfig.RegionImageDir, AppConfig.RegionSmallThumbWidth, AppConfig.RegionSmallThumbHeight, AppConfig.SmallThumbSuffix); 

         fileHelper.DeleteFile(model.ImagePath); 
         fileHelper.DeleteFile(fileHelper.GetImagePath(model.ImagePath, AppConfig.MediumThumbSuffix)); 
         fileHelper.DeleteFile(fileHelper.GetImagePath(model.ImagePath, AppConfig.SmallThumbSuffix)); 
         model.ImagePath = imagePath; 
        } 
       } 

       try 
       { 
        regionRepo.Update(region); 
        TempData["message"] = "Region successfully edited"; 
        TempData["class"] = AppConfig.FlashSuccessClass; 
        return RedirectToAction("Edit", new { id = model.Id }); 
       } 
       catch 
       { 
        return new HttpStatusCodeResult(HttpStatusCode.InternalServerError); 
       } 
      } 
      return View("Create",model); 
     } 

をテストしていアクションですと呼ばれる。しかし、テストを実行すると、このエラーが表示されます。

Moq.MockVerification例外:以下のセットアップが一致しなかった。 IRegionRepoメートル=> M =>更新()

なぜこのエラーがスローされますか? moqのverifyメソッドはどのように動作しますか?

答えて

1

は、この行を見てみましょう:

regionMock.Setup(m => m.Update(new Region())).Verifiable(); 

new Region()への入力を比較するために起こっているが、最も可能性の高いものは何でもあなたが渡していることはそれと参照上同じであることを行っていません。

に渡される*いかなる*領域はモック実装の一部になるようにRegionは `It.IsAny `基本的に配線

regionMock.Setup(m => m.Update(It.IsAny<Region>())).Verifiable(); 
+0

@Waiを試してみてください、それを問題ではない場合したがって、検証可能である。 – mason

+0

したがって、比較はおおまかに出力の比較に使用されますか? voidメソッドの場合は、検証して模擬することができます。それは...ですか? –

+0

'Verify'メソッドが呼び出されたことを確認するために使用されます。 'Verifiable'はあなたが' Verify'を呼び出すつもりであることを示します。パラメータが重要な場合は、特定のパラメータを指定できます。しかし、それらが問題でなければ、あなたは 'It.IsAny'を使うでしょう。 –

関連する問題