簡體   English   中英

使用Moq進行單元測試

[英]Unit Testing using Moq

這是在我的控制器下的一種方法,該方法用於創建偽密鑰以對應用程序中的數據進行加密並將其存儲在Amazon s3存儲桶中。

public JsonResult SaveMasterKeys(string MekText, int Thismek)
        {
            string folderName = string.Empty, fileName = string.Empty;
            List<string> folderNameList = new List<string>();
            folderNameList.Add("Guard1");
            folderNameList.Add("Guard2");
            try
            {
                if (Thismek == 1)
                {
                    folderName = "Guard1";
                    fileName = "NewMek1.key";
                }
                else
                {
                    folderName = "Guard2";
                    fileName = "NewMek2.key";
                }
                AWSS3File aws = new AWSS3File();

                //aws.BucketExist(filePath);
                //aws.CreateFile(MekText, filePath);
                // Check Weather the Folder is exist or not

                if (!aws.CheckFolderExist(folderName))
                {
                    foreach (var item in folderNameList)
                    {
                        aws.CreateFolder(item);
                        if (item == "Guard1")
                        {
                            aws.CreateFileIntoS3((item == folderName ? MekText : ""), item, "NewMek1.key");
                            aws.CreateFileIntoS3("", item, "Mek1.key");
                        }
                        else
                        {
                            aws.CreateFileIntoS3((item == folderName ? MekText : ""), item, "NewMek2.key");
                            aws.CreateFileIntoS3("", item, "Mek2.key");
                        }
                    }
                }
                else
                {
                    aws.CreateFileIntoS3(MekText, folderName, fileName);
                }
                ViewData["SaveMessage"] = "Saved successfully.";
            }
            catch (Exception ex)
            {
                XTP.Logger.LogCritical("XTP.Web.internaltools", ex.ToString());
                ViewData["SaveMessage"] = "Keys not updated successfully.";
            }
            return Json(new { success = true, value = ViewData["SaveMessage"] }, JsonRequestBehavior.AllowGet);
        }

這是我為同一篇寫的TESTMETHOD

[TestMethod]
        public void MockAlways()
        {
            var mock = new Mock<AccountController>();
            JsonResult json = new JsonResult();
            //new { success = true, value = ViewData["SaveMessage"] }, JsonRequestBehavior.AllowGet
            json.Data = new { success = true, value = "sa" };
            json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;


            mock.Setup(x => x.SaveMasterKeys("ss", 1)).Returns(json);

            var controller = new AccountController();
            var result = controller.SaveMasterKeys("ss", 1) as JsonResult;

            Assert.AreEqual(mock.Object.SaveMasterKeys("ssxs", 1), result.Data.ToString());
        }

我收到無效的安裝錯誤。 有沒有辦法解決此錯誤?

我認為您誤解了如何模擬控制器的動作。 您正在模擬它,然后將其與模擬的控制器進行比較。 這不是可行的方法(就像檢查true == true

基本上,此錯誤意味着Moq無法覆蓋非虛擬成員(這是不言自明的)。 您應該將方法的簽名更改為virtual以允許覆蓋它。

但是-您不應該嘲笑這樣的動作。 相反,您應該模擬其依賴項(服務,上下文,網關等),並檢查是否可以在不模擬動作本身的情況下使用已知的輸入值獲得預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM