如何使用C#为给定函数编写返回空值场景的NUnit负面测试用例
第一步:修正原有代码的耦合问题
原有代码中RetrieveXmlService直接硬编码实例化Database对象,无法注入Mock的数据库实现,导致测试时无法模拟数据库返回空/Null的场景,先改造服务类支持依赖注入:
public class RetrieveXmlService { private readonly IDatabase _db; // 构造函数注入数据库依赖 public RetrieveXmlService(IDatabase db) { _db = db ?? throw new ArgumentNullException(nameof(db)); } public List<string> RetrieveXmlFileName(string OrderNumber) { var Xmlname = _db.GetXmlNames(OrderNumber); // 若业务不允许返回Null,可在此处加防护逻辑:return Xmlname ?? new List<string>(); return Xmlname; } }
第二步:编写负面场景NUnit测试用例
以下用例覆盖数据库返回Null、返回空列表两种负面场景,依赖Moq库模拟IDatabase实现:
using NUnit.Framework; using Moq; using System.Collections.Generic; [TestFixture] public class RetrieveXmlServiceTests { // 负面场景1:数据库返回Null的场景 [Test] public void RetrieveXmlFileName_DatabaseReturnsNull_ReturnsNull() { // 准备测试数据 var mockDb = new Mock<IDatabase>(); // 模拟数据库调用返回Null mockDb.Setup(p => p.GetXmlNames(It.IsAny<string>())).Returns((List<string>)null); var service = new RetrieveXmlService(mockDb.Object); var testOrderNo = "invalid_order_001"; // 执行测试方法 var result = service.RetrieveXmlFileName(testOrderNo); // 断言结果符合预期 Assert.IsNull(result); // 若加了空值防护返回空列表,替换断言为:Assert.IsEmpty(result); } // 负面场景2:数据库返回空Xml名称列表的场景 [Test] public void RetrieveXmlFileName_DatabaseReturnsEmptyList_ReturnsEmpty() { // 准备测试数据 var mockDb = new Mock<IDatabase>(); // 模拟数据库调用返回空列表 mockDb.Setup(p => p.GetXmlNames(It.IsAny<string>())).Returns(new List<string>()); var service = new RetrieveXmlService(mockDb.Object); var testOrderNo = "non_exist_order_001"; // 执行测试方法 var result = service.RetrieveXmlFileName(testOrderNo); // 断言结果符合预期 Assert.IsEmpty(result); Assert.AreEqual(0, result.Count); } }
原有正向用例Mock的
ICosmosDb属于无效配置,没有注入到服务中,改造后的服务可以直接沿用上述结构编写正向用例,将Mock返回值设置为预期的两个文件名即可。
内容的提问来源于stack exchange,提问作者Shore Raina
相关产品推荐
相关产品推荐

