簡體   English   中英

MOQ C#查詢It.IsAny返回列表

[英]MOQ C# QUERIES It.IsAny returning a List

夜間我取得了很大進步。 我終於設法進行了測試。 現在,我的代碼將執行第一個測試,並最終到達控制器的CREATE METHOD。 我試圖查看是否需要更改控制器方法,以便可以使用完整的對象(也許創建一個新的IF語句,檢查admin KEY和Admin Name是否不為null。關於設計模式,您有任何建議嗎?和現實的單元測試設計?

測試:

public void Creating_One_Note()
    {

        var note = new AdminNote()
        {
            NoteId = 00003,
            UserKey = "89df3f2a-0c65-4552-906a-08bceabb1198",
            AdminKey = "4b942342-8f73-490c-b9df-f29ac859d7d7",
            NoteText = "TEST NOTE FOR THIS TEST YOU KNOW",
            CreateDate = DateTime.Now,
            ModifiedDate = DateTime.Now,
            AdminName = "Marco",
        };
        var a = _controller.Create(note);

        Assert.IsNotNull(a);
    }

控制器創建方法:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(AdminNote adminNote)
    {
        try
        {
            if (ModelState.IsValid)
            {
                adminNote.AdminKey = System.Web.HttpContext.Current.User.Identity.GetUserId();
                adminNote.AdminName = System.Web.HttpContext.Current.User.Identity.GetUserName();
                adminNote.CreateDate = DateTime.Now;
                adminNote.ModifiedDate = DateTime.Now;

                adminNote.ObjectState = ObjectState.Added;
                _adminNoteService.Insert(adminNote);



                return RedirectToAction("UserDetails", "Admin", new { UserKey = adminNote.UserKey });
            }
        }
        catch (Exception ex)
        {
            ControllerConstants.HandleException(ex);
            ViewBag.PopupMessage(string.Format("We're sorry but an error occurred. {0}", ex.Message));
        }

        return View(adminNote);
    }

如您所見,我的控制器方法返回一個VIEW,我知道我必須調整測試才能理解這一點。 但是,控制器方法將跳至異常,因為它試圖設置AdminKey和AdminName(我從前端獲得的信息)。 對於此測試,我正在對其進行硬編碼,並且我想查看該方法是否將其添加到存儲庫中。 在這種情況下我該怎么辦?

_adminNoteRepository.Setup(r => r.Find(It.IsAny<AdminNote>())).Returns<List<AdminNote>>(null);

這返回null因為您告訴它:)。 Moq將您作為參數傳遞的對象ReturnsReturns方法。 Returns方法的類型參數(在您的情況下為List<AdminNote> )僅指定返回值的類型,但是Moq不會自動創建該類型的實例。

如果您希望Moq返回一個非空值,那么您應該傳遞一個非空值,例如:

_adminNoteRepository.Setup(r => r.Find(It.IsAny<AdminNote>()))
    .Returns<List<AdminNote>>(new List<AdminNote>());

此外,在這種情況下,編譯器可以隱式確定Returns方法的type參數,因此您可以忽略它並簡單地編寫:

_adminNoteRepository.Setup(r => r.Find(It.IsAny<AdminNote>()))
    .Returns(new List<AdminNote>());

c# xUnit Moq It.IsAny<object> 沒有像預期的那樣嘲笑<div id="text_translate"><p>以下是一段代碼(簡單的 HTTP post 調用),我試圖在 Azure 函數中模擬:</p><pre> await httpClient.PostAsync("https://url.com", await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json"));</pre><p> 請注意,httpClient.PostAsync() 函數有兩個參數:URL 作為字符串,body 作為對象。</p><p> 現在,在我的測試中,我像這樣模擬這個 POST 調用:</p><pre> httpClientMock.Setup(s =&gt; s.PostAsync(It.IsAny&lt;string&gt;(), It.IsAny&lt;object&gt;())).ReturnsAsync(mockedHttpResponse);</pre><p> 我期待await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json")不會被調用,因為我將它設置為與任何對象一起工作。但是,我的測試用例失敗了例外:</p><blockquote><p> 在 System.IO.Path.Combine(String path1, String path2) 處發現 System.ArgumentNullException 消息“Value cannot be null. (Parameter 'path1')”</p></blockquote><p> 當我通過在測試中設置環境變量來提供正確的路徑(即使是虛擬路徑也不起作用)時,它就起作用了。 但這似乎不是正確的方法,因為單元測試旨在在各種機器上運行,並且每台機器的基本路徑都不同。</p></div></object>

[英]c# xUnit Moq It.IsAny<object> not mocking as expected

暫無
暫無

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

相關問題 c# xUnit Moq It.IsAny<object> 沒有像預期的那樣嘲笑<div id="text_translate"><p>以下是一段代碼(簡單的 HTTP post 調用),我試圖在 Azure 函數中模擬:</p><pre> await httpClient.PostAsync("https://url.com", await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json"));</pre><p> 請注意,httpClient.PostAsync() 函數有兩個參數:URL 作為字符串,body 作為對象。</p><p> 現在,在我的測試中,我像這樣模擬這個 POST 調用:</p><pre> httpClientMock.Setup(s =&gt; s.PostAsync(It.IsAny&lt;string&gt;(), It.IsAny&lt;object&gt;())).ReturnsAsync(mockedHttpResponse);</pre><p> 我期待await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json")不會被調用,因為我將它設置為與任何對象一起工作。但是,我的測試用例失敗了例外:</p><blockquote><p> 在 System.IO.Path.Combine(String path1, String path2) 處發現 System.ArgumentNullException 消息“Value cannot be null. (Parameter 'path1')”</p></blockquote><p> 當我通過在測試中設置環境變量來提供正確的路徑(即使是虛擬路徑也不起作用)時,它就起作用了。 但這似乎不是正確的方法,因為單元測試旨在在各種機器上運行,並且每台機器的基本路徑都不同。</p></div></object> Moq轉換It.IsAny <Exception> 去吧 <string> 在期待中 使用It.IsAny進行Moq單元測試 <DateTime> ()失敗 Moq&gt; = 4.5.7暴露It.IsAny上的異常 <decimal> () Moq 在使用 It.Is 但不是 It.IsAny 驗證時拋出 NullReferenceException Moq的It.IsAny怎么樣? <T> ()實施 設置最小起訂量以使用It.IsAny模擬復雜類型 如何將表達式簽名轉換為適用於Moq的It.IsAny的表達式 使用Moq It.IsAny使用通用Lambda設置Mock用於泛型函數 Moq 使用 ReturnsAsync 並修改 It.IsAny 輸入參數
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM