单元测试:模拟返回 null

问题描述 投票:0回答:1

我已经在相同的场景下做了很多次,但这次失败了,我无法找出原因,请帮助我。

下面是我的代码,我已经尝试过 Moq 和 NSubsitute,但是对于这两者,返回是返回

null
但它应该返回 json,我放在里面,我在以前的项目中也做了同样的事情,但是从来没有遇到过这样的问题,我的头脑完全不工作。

public interface IMyInterface
{
    public string myOrder(List<Order> order);       
}

目标类别

public class funcMyFunctionApp
{
    private readonly IMyInterface myInterface;
    private readonly TelemetryClient telemetryClient;
    private readonly ILogger _logger;

    public funcMyFunctionApp(IMyInterface _myInterface)
    {
        myInterface = _myInterface;
    }

    [FunctionName("func1")]
    public IActionResult func1([HttpTrigger(AuthorizationLevel.Function, "post",Route = "func1")] string jsoninput)
    {
        try
        {
            if (!string.IsNullOrEmpty(jsoninput))
            {
                return new OkObjectResult(myInterface.myOrder(JsonConvert.DeserializeObject<List<Order>>(jsoninput)));
            }
            else
            {
                return new BadRequestObjectResult("Bad Order");
            }
        }
        catch (Exception ex)
        {
            _logger.LogError(ex.Message);
            if(ex.InnerException != null)
            {
                _logger.LogError(ex.InnerException.Message.ToString());
            }
            return new BadRequestObjectResult("Bad Order");
        }
    }
}

测试治具

public void shouldReturnOkObjectResultifInputisValid()
{
    string ValidJson1 = @"[
        {
          ""CreatedBy"":""[email protected]"",
          ""OrderNo"":""Pizz111"",
          ""Amount"":""10$"",
        }
    ]";
    string ValidOutputJson1 = @"{
        ""OrderNo"": ""808098"",
        ""Item"": ""Pizza""
    }";
    Mock<IMyInterface> myInterfaceMock =new Mock<IMyInterface>();
    IMyInterface myInterfaceSubsititueMock = Substitute.For<IMyInterface>();
    var input = JsonConvert.DeserializeObject<List<Order>>(ValidJson1);
    myInterfaceMock.Setup(m=>m.myOrder(input)).Returns(ValidOutputJson1);
    
    //Local Arrange
    myInterfaceSubsititueMock.myOrder(ValidJson1).Returns(ValidOutputJson1);
    funcMyFunctionApp funcRequest = new funcMyFunctionApp(myInterfaceMock.Object);
    
    // Act
    var result = funcRequest.func1(ValidJson1);
    
    // Assert
    Assert.Multiple(() =>
    {
        Assert.That((((OkObjectResult)result).Value as string), Is.EqualTo(ValidOutputJson1));
    });
}  

我期望它应该返回

Returns

下提供的字符串
c# unit-testing moq nsubstitute
1个回答
0
投票

TL;DR:

JsonConvert.DeserializeObject<List<Order>>(jsoninput)
JsonConvert.DeserializeObject<List<Order>>(ValidJson1)
不同。

对于 Moq,库使用

object.Equals
来确定形式参数和实际参数是否相同。换句话说,它对引用类型执行引用检查。这就是为什么即使你的两个
JsonConvert.DeserializeObject
方法调用返回相同的集合,但它们将是两个不同的 List 实例。

为了解决您的问题,请在

It.IsAny<List<Order>>()
通话中使用
Setup

myInterfaceMock
   .Setup(m=>m.myOrder(It.IsAny<List<Order>>()))
   .Returns(ValidOutputJson1);

Dotnet 小提琴:https://dotnetfiddle.net/dYcKk6

© www.soinside.com 2019 - 2024. All rights reserved.