2016-05-02 8 views
1

私はASP.NETプロジェクトを開発中です。私は私のプロジェクトでユニットテストをしています。だから私はマイクロソフトのユニットテストフレームワークを使用しました。私はMoqを使ってUnit Testのデータを模擬しています。しかし、Moqを使用して文字列値を返す関数を嘲笑することに問題があります。それで問題は、空でない文字列を返すためにそれを嘲笑しても、常に空に戻ってしまうことです。以下の私のシナリオをチェックしてください。ASP.NET MVCユニットテストでMoqを使用して関数をモックする際に空でない文字列を返すことはできません

これはテストするために私のコントローラとアクションです:

public class RegionController : Controller 
    { 
     private IRegionRepo regionRepo; 

     private IFileHelper fileHelper; 

     private int RecordPerPage; 

     public RegionController(IRegionRepo regionParam,IFileHelper fileParam,int recordPerPage = 0) 
     { 
      this.regionRepo = regionParam; 
      this.RecordPerPage = (recordPerPage == 0) ? AppConfig.RecordPerPage : recordPerPage; 
      this.fileHelper = fileParam; 
     } 


    [HttpPost] 
    public ActionResult Create(CreateRegionVM model) 
    { 
     if(model.ImageFile==null || model.ImageFile.ContentLength<1) 
     { 
      ModelState.AddModelError("ImagePath", "Image file is required"); 
     } 

     if(ModelState.IsValid) 
     { 
      Region region = new Region 
      { 
       Name = model.Name, 
       MmName = model.MmName, 
       MmDescription = model.MmDescription, 
       Description = model.Description, 
       GeoLocation = model.GeoLocation 
      }; 
      try 
      { 
       region.ImagePath = fileHelper.UploadFile(model.ImageFile, "Uploads/Images"); 
      } 
      catch 
      { 
       return new HttpStatusCodeResult(500); 
      } 

      if(String.IsNullOrEmpty(region.ImagePath)) 
      { 
       return new HttpStatusCodeResult(500); // problem is here. always reach here even if I returned nonempty value from fileUpload function 
      } 

      //regionRepo.Create(region); 


      return RedirectToAction("Create"); 
     } 
     return View(model); 
    } 

} 

私は問題は私のコードに存在する場合コメントしました。

これは私のテストコードです:

[TestMethod] 
     public void Cannot_Create_If_Upload_Fail() 
     { 
      var file = new Mock<HttpPostedFileBase>(); 
      file.Setup(m => m.ContentLength).Returns(1); 
      CreateRegionVM model = new CreateRegionVM(); 
      model.ImageFile = file.Object; 
      Mock<IRegionRepo> regionRepoMock = new Mock<IRegionRepo>(); 
      regionRepoMock.Setup(m => m.Create(new Region())).Returns(new Region()); 
      Mock<IFileHelper> fileHelperMock = new Mock<IFileHelper>(); 

      //here I did not returned empty string. So test should be failed. 
      fileHelperMock.Setup(m => m.UploadFile(model.ImageFile, It.Is<string>(y=>y=="Directory"), null)).Returns(It.Is<string>(x=>x=="XXX")); 

      RegionController controller = new RegionController(regionRepoMock.Object, fileHelperMock.Object, 3); 
      var unknownView = controller.Create(model); 
      Assert.IsInstanceOfType(unknownView, typeof(HttpStatusCodeResult), "View type is wrong"); 
      HttpStatusCodeResult view = unknownView as HttpStatusCodeResult; 
      Assert.AreEqual(view.StatusCode, 500, "Status code is not 500 when upload error"); 
     } 

あなたが見ることができるように私は、ファイルアップロード機能のために空返しませんでしたので、上記のコードは失敗しなければなりません。また、問題を確実にするために関数createをコメントしました。私はいくつかの方法で問題がそこから来たことを確認するためにテストしました。なぜそれが起こっているのですか?モックメソッドが常に空の文字列を返すのはなぜですか?私が "XXX"を返したので、上記のコードテストは失敗する必要があります。空でない値を返すにはどうしたらいいですか?

答えて

2

あなたはreturn文のためIt.Isを使用したくない、あなたが実際に返すようにしたいものをすることを設定したいです。

  fileHelperMock.Setup(m => m.UploadFile(model.ImageFile, It.Is<string>(y=>y=="Directory"), null)).Returns("XXX"); 

私はこの方法を試してみました。 fileHelperMock.Setup(m => m.UploadFile(model.ImageFile、It.Is(y => y == "Uploads/Images")、null))を返します。 。 It.Is(x => x == "XXX")が返されます。しかし、「アップロード/画像」は機能しません。私が他の値を渡したとき、それは動作しません。どうしてですか?

あなたは「ディレクトリ」の設定にその値をハードコーディングされているので、これは、このしようとされています。私は、パラメータ値を変更してみました

fileHelperMock.Setup(m => m.UploadFile(model.ImageFile, It.IsAny<string>(), null)).Returns("XXX"); 
0

problemaは、ディレクトリ用のパラメータです:

fileHelperMock.Setup(m => m.UploadFile(model.ImageFile, It.Is<string>(y=>y=="Uploads/Images"), null)).Returns(It.Is<string>(x=>x=="XXX")); 
+0

を。まだ動かない。戻り値が空でなくても、テストは失敗しません。 –

+0

私はこのようにしました。 fileHelperMock.Setup(m => m.UploadFile(model.ImageFile、It.Is )(y => y == "Uploads/Images")、null))を返します。 。それはありません。(x => x == "XXX")が返されます。しかし、「アップロード/画像」は機能しません。私が他の値を渡したとき、それは動作しません。どうしてですか? –