簡體   English   中英

代表不拿 N arguments (FakeItEasy / C# 9.0)

[英]Delegate does not take N arguments (FakeItEasy / C# 9.0)

C# 9.0,FakeItEasy 7.3.1

這可能只是我很笨,但是......為什么 FakeItEasy 抱怨委托的參數不匹配??? 幾個小時以來,我一直用頭撞牆。

public interface IBaseInterface<T> {
      //Not detailed here, for simplification
}

public interface IMyInterface : IBaseInterface<T> {

    public Task<IEnumerable<T>> SearchByCriteriaAsync(
       Guid param0,
       Guid? param1,
       FooClass param2,
       BarClass? param3,
       IEnumerable<Guid> param4, 
       bool param5 = true,
       bool param6 = false,
       bool param7 = true, 
       IReadOnlyCollection<Guid>? param8 = null);
}


internal class MyClass : IMyInterface {
    public Task<IEnumerable<T>> SearchByCriteriaAsync(
       Guid param0,
       Guid? param1,
       FooClass param2,
       BarClass? param3,
       IEnumerable<Guid> param4, 
       bool param5 = true,
       bool param6 = false,
       bool param7 = true, 
       IReadOnlyCollection<Guid>? param8 = null)
    {
        return new List<T>().AsEnumerable();
    }
}

測試 class:

        IMyInterface fake = A.Fake<IMyInterface>();


        A.CallTo(() => fake.SearchByCriteriaAsync(
                    A<Guid>.Ignored,
                    A<Guid?>.Ignored,
                    A<FooClass>.Ignored,
                    A<BarClass?>.Ignored,
                    A<IEnumerable<Guid>>.Ignored,
                    A<bool>.Ignored,
                    A<bool>.Ignored,
                    A<bool>.Ignored,
                    A<IReadOnlyCollection<Guid>?>.Ignored
                    ))
                .ReturnsLazily(
                     (
                        Guid param0,
                        Guid? param1,
                        FooClass param2,
                        BarClass? param3,
                        IEnumerable<Guid> param4, 
                        bool param5 = true,
                        bool param6 = false,
                        bool param7 = true, 
                        IReadOnlyCollection<Guid>? param8 = null
                     ) => {
                        return new List<T>().AsEnumerable();
                     }
                );

“ReturnsLazily(...)”中的所有內容都以紅色突出顯示,錯誤消息“ Error CS1593 Delegate 'Func<IFakeObjectCall, Task<IEnumerable<T>>>' does not take 9 arguments

如果我到處刪除參數“customerId”,那么編譯器就會停止抱怨

FakeItEasy 具有最多 8 個參數的ReturnsLazily重載(這是一個任意限制,我們本可以停在 4 或 12 個,但它似乎是一個合理的數量)。

由於您要傳遞一個帶有 9 個參數的委托,因此它與任何重載都不匹配。 編譯器假設(錯誤地)您正在嘗試調用接受Func<IFakeObjectCall, Task<IEnumerable<T>>>的重載,但您傳遞的委托與該委托不匹配,因此它失敗了。

解決此問題的最佳方法可能需要重構您的代碼,以便您的方法不需要采用這么多參數。 如果您不能或不想這樣做,解決方法是使用適用於IFakeObjectCall的重載:

...
.ReturnsLazily(call => new List<T>().AsEnumerable());

(請注意,如果您需要訪問委托中的參數值,可以使用call.GetArgument<Guid>(0)call.GetArgument<FooClass>("param2")等)

暫無
暫無

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

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