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

时间:2019-04-02 02:15:26

标签: c# lambda moq xunit stub

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

keyboard = (
            ("qwertyuiop", 0), ("QWERTYUIOP", 0), ("asdfghjkl", 1),
            ("ASDFGHJKL", 1), ("zxcvbnm,.", 2), ("ZXCVBNM<>", 2)
)

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

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

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

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

现在,不是引发编译器错误,而是引发了异常:

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).

这里是模拟的类IMyClass:

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()
    {
        //...
    }
}

似乎我的两个选择是引发异常或无法编译。我不确定在这里可以做什么。如果有什么我想念的,请告诉我。

1 个答案:

答案 0 :(得分:3)

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

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