【问题标题】:does not contain defination for 'ReturnsAsync' and best extension method overload不包含“ReturnsAsync”和最佳扩展方法重载的定义
【发布时间】:2021-04-07 04:05:24
【问题描述】:

无法调用此函数 CallComplianceStarter ...

得到错误 cs1929 Isetup'不包含'ReturnsAsync'和最佳扩展方法重载的定义

 public async Task<object> Get_Compliance_QueryParameter_ReturnsOkStatusCode()
        {
            //Arrange


           var mockServiceResult = new { TriggerFlow = "Test" };

            _mockService.Setup(x => x.CallComplianceStarter(It.IsAny<string>(), It.IsAny<MessageHeader>()))
            .ReturnsAsync(mockServiceResult);



            var workFlowsController = new WorkFlowsController(_mockController.Object, _mockService.Object);
            workFlowsController.ControllerContext = new ControllerContext();
            workFlowsController.ControllerContext.HttpContext = new DefaultHttpContext();
            //Act
            var result = await workFlowsController.Get("P");
            //Assert
            Assert.Equal(((ObjectResult)result).StatusCode, (int)HttpStatusCode.OK);
            return result;
        }

public async Task<WorkFlowsResponse> CallComplianceStarter(string flowName, MessageHeader messageHeader)
{
            
  // Imeplementation         
 return new WorkFlowsResponse { TriggerFlow = flowName };
           
}

【问题讨论】:

    标签: c# .net unit-testing


    【解决方案1】:

    选项 A

    您应该将CallComplianceStarter 签名更改为同步。

    虽然 _mockService 确实有一个方法:

    Task<WorkFlowsResponse> CallComplianceStarter(string flowName, MessageHeader messageHeader)
    

    测试应该是

    public WorkFlowsResponse CallComplianceStarter(string flowName, MessageHeader messageHeader)
    {                
        // Imeplementation         
        return new WorkFlowsResponse { TriggerFlow = flowName };               
    }
    

    如果您注意ReturnsAsync 签名,您会发现它有一个只接受参数的重载:TResult value

    public static IReturnsResult<TMock> ReturnsAsync<TMock, TResult>(this IReturns<TMock, Task<TResult>> mock, TResult value) where TMock : class;
    

    选项 B

    不知道为什么在测试中首先需要这个CallComplianceStarter?你只是从生产中复制它吗?我相信您只需要一个特定的返回值,例如 new WorkFlowsResponse { TriggerFlow = "MyFlowName" };

    并将其用于:

    var expected = new WorkFlowsResponse { TriggerFlow = "MyFlowName" };
    _mockService.Setup(x => x.CallComplianceStarter(It.IsAny<string>(), It.IsAny<MessageHeader>()))
    .ReturnsAsync(expected); 
    

    【讨论】:

    • 嗨,Shahar,即使这个没有抛出异常,var mockServiceResult = new WorkFlowsResponse { TriggerFlow = "Test" }; _mockService.Setup(x => x.CallComplianceStarter(It.IsAny(), It.IsAny())) .ReturnsAsync(mockServiceResult);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多