You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:18:00