c# - Lambda 函数导致带有 0 个参数的编译器错误,带有 1 个或多个参数的异常

标签 c# lambda moq xunit stub

我在带有 Moq 的 C# .NET CORE 环境中使用 lambda 函数。更具体地说,我在这样的设置方法中使用它:

MockObject.Setup(o => o.GetList()).Returns<List<DifferentClass>>(() => Task.FromExisting(existingList));

问题出在 .Returns() 调用中。如果我使用空的 Lambda,我会收到以下编译器错误:

  error CS1593: Delegate 'Func<List<DifferentClass>,  Task<List<DifferentClass>>>' does not take 0 arguments.

这意味着我需要向 lambda 添加一个参数。我这样做如下:

MockObject.Setup(o => o.GetList()).Returns<List<DifferentClass>>(o => Task.FromExisting(existingList));

现在,抛出异常而不是编译器错误:

System.ArgumentException : Invalid callback. Setup on method with 0 parameter(s) cannot invoke callback with different number of parameters (1).

堆栈跟踪引用同一行代码。

示例代码如下:

测试:

public class UnitTest1
{
    static readonly Mock<IMyClass> MockObject;

    static UnitTest1()
    {
        MockObject = new Mock<IMyClass>();
        var existingList = new List<DifferentClass>();
        // Line causing exception below
        MockObject.Setup(o => o.GetList()).Returns<List<DifferentClass>>(() => Task.FromExisting(existingList));
    }

    // Tests go here...
    [Fact]
    Test1()
    {
        //...
    }
}

这是模拟类 IMyClass:

public interface IMyClass
{
    Task<List<DifferentClass>> GetList();
}

看来我的两个选择是抛出异常或编译失败。我不确定我能在这里做什么。如果我遗漏了什么,请告诉我。

最佳答案

根据模拟接口(interface)的定义,只需调用 .ReturnsAsync(existingList); 即可推断类型。

static UnitTest1()
{
    MockObject = new Mock<IMyClass>();
    var existingList = new List<DifferentClass>();
    MockObject
        .Setup(o => o.GetList())
        .ReturnsAsync(existingList);
}

关于c# - Lambda 函数导致带有 0 个参数的编译器错误,带有 1 个或多个参数的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55466010/

相关文章:

javascript - 使用预先存在的访问 token 通过 ASP.NET 创建 YouTube 服务

c# - "Nested foreach"与 "lambda/linq query"性能(LINQ 到对象)

string - 如何在 Java 8 中使用 Map Put 操作编写字符串迭代?

c# - 将 Moq 模拟对象传递给构造函数

c# - Moq:Mock SetUp 方法在测试期间仅返回 null

c# - Expression Blend 与 Visual Studio

c# - 如何在 iPhone 中显示/查找从 xamarin.ios 下载的图像?

c# - 将字典分配给键值

java - 为什么带有显式返回的空 lambda 和构造函数会导致编译器错误(Java Bug?)

c# - 使用 Moq 模拟插入查询到 MySQL 数据库