我已经在相同的场景下做了很多次,但这次失败了,我无法找出原因,请帮助我。
下面是我的代码,我已经尝试过 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
下提供的字符串
TL;DR:
JsonConvert.DeserializeObject<List<Order>>(jsoninput)
与 JsonConvert.DeserializeObject<List<Order>>(ValidJson1)
不同。
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