簡體   English   中英

如何在單元測試中使用 Moq 在異步方法中返回傳遞的參數?

[英]How to return passed parameters in an async method with Moq in unit tests?

我正在努力解決如何使用 Moq-Setup-Return 構造的問題。

首先,我的設置:

某些類型為IRepository -Interface 的存儲庫必須實現StoreAsync ,該方法返回一個 StoreResult 對象,其中包含存儲的實體作為屬性。

using System.Threading.Tasks;
using Moq;
using Xunit;

namespace Tests
{
    public class Entity { }

    public class StoreResult
    {
        public Entity Entity { get; set; }
    }

    public interface IRepository
    {
        Task<StoreResult> StoreAsync(Entity entity);
    }

    public class Tests
    {
        [Fact]
        public void Test()
        {
            var moq = new Mock<IRepository>();
            moq.Setup(m => m.StoreAsync(It.IsAny<Entity>())).Returns(e => Task.FromResult<Task<StoreResult>>(new StoreResult {Entity = e}));
        }
    }
}

現在我嘗試為 IRepository-Interface 編寫一個 Mock-Objekt,但我不知道如何對 Return-Statement 進行編碼,以便 StoreResult-Object 包含作為參數提供給 StoreAsync-Function 的實體。

我在Moq ReturnsAsync() 中閱讀了有關此主題的內容, 其中包含傳遞給方法的參數返回值

我試過了

moq.Setup(m => m.StoreAsync(It.IsAny<Entity>()))
     .ReturnsAsync(entity => new StoreResult {Entity = entity});

帶有錯誤語句“無法將 lambda 表達式轉換為類型“ StoreResult ”,因為它不是委托類型。

並使用我嘗試過的相同錯誤消息

moq.Setup(m => m.StoreAsync(It.IsAny<Entity>()))
     .Returns(e => Task.FromResult<Task<StoreResult>>(new StoreResult {Entity = e}));

我正在使用帶有Moq 4.6.36-alpha的 .NET Core xUnit 環境

謝謝你的幫助。

感謝 Callum Linigton 的提示,我找到了以下解決方案:

moq
 .Setup(m => m.StoreAsync(It.IsAny<Entity>()))
 .Returns((Entity e) => Task.FromResult(new StoreResult {Entity = e}));

關鍵區別在於為 lambda 表達式的輸入參數指定類型以避免歧義調用。

暫無
暫無

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

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