2016-05-04 4 views
0

Ich entwickle ein ASP.NET MVC-Projekt. In meinem Projekt mache ich Unit Testing. Ich benutze Moq, um meine Geschäftslogik zu verspotten. Aber ich habe ein Problem mit Moq. Vor allem mit mock.Verify-Methode. Bitte sehen Sie mein Szenario unten.Verify Methode Moq werfen Fehler in ASP.NET MVC-Unit-Test

Dies ist die Aktion, die ich

Prüfung am
[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); 
     } 

Diese Funktion meines Tests ist

[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"); 
     } 

Wie Sie meine Testmethode sehen können, ist mir sicher, dass regionRepo.Update Methode, um mit verifizieren namens. Aber es gibt mir diesen Fehler, wenn ich den Test durchführe.

Moq.MockVerification Ausnahme: Die folgenden Einstellungen wurden nicht angepasst: IRegionRepo m => m => Update()

Warum wird dieser Fehler ausgelöst? Wie funktioniert die Verifikationsmethode von moq?

Antwort

1

Werfen Sie einen Blick auf dieser Zeile:

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

Es ist die Eingabe in new Region() gehen zu vergleichen, aber höchstwahrscheinlich in was auch immer Sie vorbei zu, dass nicht referenziell gleich sein wird.

Wenn die Region, versuchen

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

@Wai Die 'It.IsAny ' grundsätzlich Drähte spielt keine Rolle, bis es, dass so * jeder * Region, die Teil der Mock-Implementierung wird an sie übergeben wird sein und daher überprüfbar. – mason

+0

Also wird Verify grob für den Vergleich der Ausgabe verwendet? Wenn void-Methode, können wir nur überprüfen und verspotten. Ist es? –

+0

'Verify' wird verwendet, um zu überprüfen, dass Methoden aufgerufen wurden. 'Überprüfbar' zeigt an, dass Sie' Bestätigen' aufrufen möchten. Wenn die Parameter wichtig sind, können Sie spezifische Parameter angeben. Aber wenn sie nicht wichtig sind, würden Sie 'It.IsAny' verwenden. –