【问题标题】:Moq: Change Setup Returns Generic method to deal with Asynchronous ParameterMoq:更改设置返回处理异步参数的通用方法
【发布时间】:2021-01-15 14:45:24
【问题描述】:

我有一个起订量设置语句,看起来像这样,带有一个基于传入枚举值的条件/通用 Returns 语句:

        MyLogic.Setup(m => m.MyLogicMethod(It.IsAny<MyEnum>()))
                                     .Returns<MyEnum>((x) =>
                                     {
                                         switch (x)
                                         {
                                             case MyEnum.Enum1: return "stringval1";
                                             case MyEnum.Enum2: return "stringval2";
                                             case MyEnum.Enum3: return "stringval3";
                                             case MyEnum.Enum4: return "stringval4";
                                             case MyEnum.Enum5: return "stringval5";
                                             default: return string.Empty;
                                         }
                                     });

我现在已将正在测试的方法更改为异步(返回 Task&lt;string&gt;)。 Moq 不提供通用 ReturnsAsync,那么如何更改上述 Setup 语句以使用异步方法?

        MyLogic.Setup(m => m.MyLogicMethodAsync(It.IsAny<MyEnum>()))
                                     .Returns????

【问题讨论】:

    标签: c# asynchronous moq


    【解决方案1】:

    你不必使用ReturnAsync,你可以保留你的返回方法,只返回一个Task&lt;&gt;

    MyLogic.Setup(m => m.MyLogicMethod(It.IsAny<MyEnum>()))
                                     .Returns<MyEnum>((x) =>
                                     {
                                         string returnValue = null;
                                         switch (x)
                                         {
                                             case MyEnum.Enum1: returnValue = "stringval1";
                                             case MyEnum.Enum2: returnValue = "stringval2";
                                             case MyEnum.Enum3: returnValue = "stringval3";
                                             case MyEnum.Enum4: returnValue = "stringval4";
                                             case MyEnum.Enum5: returnValue = "stringval5";
                                             default: returnValue = string.Empty;
                                         }
    
                                         return Task.FromResult(returnValue);
                                     });
    

    【讨论】:

    • 它现在需要在案件之间进行“休息”,但是是的,Task.FromResult 可以工作,谢谢。
    【解决方案2】:

    Moq 不提供通用 ReturnsAsync,

    Moq 确实提供了一个通用的ReturnsAsync

    //
    // Summary:
    //     Specifies a function that will calculate the value to return from the asynchronous
    //     method.
    //
    // Parameters:
    //   mock:
    //     Returns verb which represents the mocked type and the task of return type
    //
    //   valueFunction:
    //     The function that will calculate the return value.
    //
    // Type parameters:
    //   TMock:
    //     Mocked type.
    //
    //   TResult:
    //     Type of the return value.
    public static IReturnsResult<TMock> ReturnsAsync<TMock, TResult>(this IReturns<TMock, Task<TResult>> mock, Func<TResult> valueFunction) where TMock : class;
    

    组装起订量,版本 = 4.15.0.0

    将您的泛型参数移动到委托中,以便泛型方法可以隐含它。

    MyLogic
        .Setup(m => m.MyLogicMethodAsync(It.IsAny<MyEnum>()))
        .ReturnsAsync((MyEnum x) => {
             switch (x) {
                 case MyEnum.Enum1: return "stringval1";
                 case MyEnum.Enum2: return "stringval2";
                 case MyEnum.Enum3: return "stringval3";
                 case MyEnum.Enum4: return "stringval4";
                 case MyEnum.Enum5: return "stringval5";
                 default: return string.Empty;
             }
         });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-16
      • 2015-12-14
      • 2018-09-01
      • 1970-01-01
      • 2018-06-13
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多