gpt4 book ai didi

c# - 如何在单元测试中使用 Moq 在异步方法中返回传递的参数?

转载 作者:太空狗 更新时间:2023-10-30 00:38:45 25 4
gpt4 key购买 nike

我正在努力解决如何使用 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() with parameters 中读到了这个主题和 Returning value that was passed into a method .

我试过了

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

错误语句“无法将 lambda 表达式转换为类型“StoreResult”,因为它不是委托(delegate)类型。

我试过同样的错误信息

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 表达式的输入参数的类型,以避免模棱两可的调用。

关于c# - 如何在单元测试中使用 Moq 在异步方法中返回传递的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38695921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com