gpt4 book ai didi

c# - 模拟对象在单元测试中为空

转载 作者:行者123 更新时间:2023-12-05 06:31:17 25 4
gpt4 key购买 nike

我正在编写一个单元测试,我有 1 个模拟对象,它将返回一个包含 JSON 的动态类型。该调用是异步的并且看起来很好,但是当我运行代码并进入类 im 测试时,模拟为 null (m.GetResults) 并且我设置的返回数据未显示。

我刚开始使用 Moq,不确定我是否做错了什么。任何人都可以发现为什么它会为空的问题吗?

public async Task GetPaymentDetailSummaryTestAsync(){                        

Task<dynamic> json = GetSampleJsonAsync();

var mock = new Mock<ICallProcedure>();
mock.Setup(m => m.GetResults("dbo.GetPaymentDetailSummary",
new { ID = 600002, Year = 2018}))
.ReturnsAsync(json);

var payments = new Payments(mock.Object);
var result = await payments.GetPaymentDetailSummaryAsync(2018, 600002);
Assert.IsNotNull(result);
Assert.IsInstanceOfType(result, typeof(List<PaymentSummary>));
Assert.AreEqual(1, result.Count);
}

public async Task<dynamic> GetSampleJsonAsync(){
return await Task.FromResult(JsonConvert.SerializeObject("[{\"PaymentNumber\":1,\"Payment\":1200.00}]"));
}

Payments 待测类

public class Payments : IPayments
{
private ICallProcedure callProc;

public Payments(ICallProcedure CallProc)
{
callProc = CallProc;
}

public async Task<List<PaymentSummary>> GetPaymentDetailSummaryAsync(int year, int iD)
{
var getPaymentDetailSummary = await callProc.GetResults("dbo.GetPayment", new { ID = id, Year = year });
List<PaymentSummary> paymentDetailSummary = null;
paymentDetailSummary = JsonConvert.DeserializeObject<List<PaymentSummary>>(getPaymentDetailSummary);

return paymentDetailSummary;
}
}

最佳答案

您已经发现模拟的设置与实际行为与预期行为不匹配,并且使用 It.IsAny<T>()是那个问题的解决方案,比如

mock.Setup(_ => _.GetResults(It.IsAny<string>(), It.IsAny<object>())) 
.ReturnsAsync(json);

根据被测类和模拟的设置,由此产生的问题是,您似乎正在对预期的 JSON 结果进行双重序列化。您手动创建一个 JSON 字符串,然后再次将其序列化。

考虑将测试重构为更简单的方式,使用实际对象生成 JSON,而不是尝试手动制作它。同一对象也可用于进行断言。

public async Task GetPaymentDetailSummaryTestAsync(){                        
//Arrange
List<PaymentSummary> expected = new List<PaymentSummary> {
new PaymentSummary {
PaymentNumber = 1,
Payment = 1200.00
}
};
var json = JsonConvert.SerializeObject(expected);

var mock = new Mock<ICallProcedure>();
mock.Setup(_ => _.GetResults(It.IsAny<string>(), It.IsAny<object>()))
.ReturnsAsync(json);

var payments = new Payments(mock.Object);

//Act
var actual = await payments.GetPaymentDetailSummaryAsync(2018, 600002);

//Assert
Assert.IsNotNull(actual);
Assert.IsInstanceOfType(actual, typeof(List<PaymentSummary>));
Assert.AreEqual(1, actual.Count);
CollectionAssert.AreEquivalent(expected, actual);
}

关于c# - 模拟对象在单元测试中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51860372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com