【问题标题】:How to get passing parameter count in a function NUNIT mocking assertion?如何在函数 NUNIT 模拟断言中获取传递参数计数?
【发布时间】:2023-02-07 03:11:03
【问题描述】:
如何使用 Nunit 模拟断言获取传递给函数的参数计数以及在另一个函数中调用的函数。
例如:
public class TestClass
{
public string Name {get;set;}
public int Id {get;set;}
}
public void ProcessData(IEnumerable<EventData> events)
{
List<TestClass> testClasses = new();
events.ForEach(msg => {
var testClass = JsonConvert.DeserializeObject<TestClass>(msg.EventBody.ToString());
if(testClass != null)
{
testClasses.Add(testClass);
}
});
if(testClasses.Count > 0)
{
BulkUpdateData(testClasses);
}
}
public void BulkUpdateData(List<TestClass> testClasses)
{ ... }
现在,我需要对这个“ProcessData”方法进行单元测试。
为此,使用 .Net 6.0 中的 NUnit 框架。
我可以在编写单元测试用例时通过模拟将测试数据传递给“ProcessData”方法。
但我的情况是,
现在考虑我将列表中的 10 个值传递给“ProcessData”。因为只有 8 个值被传递给“BulkUpdateData”方法,因为 2 个值由于无效数据而未被反序列化。
此处如何获取此 BulkUpdateData 在“ProcessData”方法中获取了 8 个值。
我需要获取此计数值以进行断言。
请对此提出建议。
【问题讨论】:
标签:
c#
.net
unit-testing
nunit
moq
【解决方案1】:
您的 ProcessData() 方法需要返回一些东西。 int 表示已处理的测试类的计数,或 List<TestClass>。
随着您的 ProcessData() 方法现在返回一些内容,您可以继续编写您的断言,确切地知道有多少测试类被传递给 BulkUpdateData() 方法。
public IEnumerable<TestClass> ProcessData(IEnumerable<EventData> events)
{
List<TestClass> testClasses = new();
events.ForEach(msg => {
var testClass = JsonConvert.DeserializeObject<TestClass>(msg.EventBody.ToString());
if (testClass != null)
{
testClasses.Add(testClass);
}
});
if (testClasses.Count > 0)
{
BulkUpdateData(resultOfProcessData);
}
return testClasses;
}
如果我误解了你的问题,实际上,你想对 BulkUpdateData() 方法进行单元测试,在你的 [TestFixture] 中,你可以添加一个实例变量来保存 TestClass 对象的计数或列表。你可以利用 [OrderAttribute] 并像这样组织你的测试:
[TestFixture]
public class UnitTests
{
List<TestClass> resultOfProcessData = new();
[Test]
[Order(1)]
public void ProcessDataUnitTest()
{
resultOfProcessData = ProcessData(events);
}
[Test]
[Order(2)]
public void BulkUpdateDataUnitTest()
{
if (resultOfProcessData.Count > 0)
{
BulkUpdateData(resultOfProcessData);
}
}
public IEnumerable<TestClass> ProcessData(IEnumerable<EventData> events)
{
List<TestClass> testClasses = new();
events.ForEach(msg => {
var testClass = JsonConvert.DeserializeObject<TestClass>(msg.EventBody.ToString());
if (testClass != null)
{
testClasses.Add(testClass);
}
});
return testClasses;
}
public void BulkUpdateData(List<TestClass> testClasses)
{ ... }
}
希望这可以帮助。