如何使用 c# 为给定函数创建负 nunit 测试用例

Posted

技术标签:

【中文标题】如何使用 c# 为给定函数创建负 nunit 测试用例【英文标题】:How to create negative nunit test case for the given function using c# 【发布时间】:2021-12-24 22:21:04 【问题描述】:

数据库接口:

public interface IDatabase:
    
        List<string> GetXmlNames(string OrderNumber);
    

数据库的实现:

 class Database: IDatabase
    
        public List<string> GetXmlNames(string OrderNumber)
        
            var XmlName = new List<string>();
            XmlName.Add("CustomerXmlFileName");
            XmlName.Add("GeneratedXmlFileName");

            return XmlName;
        
    

从数据库中获取 Xml 名称的函数 - 它以订单号为参数并返回一个字符串列表(2个Xml名称)

public class RetrieveXmlService
    
        public List<string> RetrieveXmlFileName(string OrderNumber)
        
            Database db = new Database();
            var Xmlname = db.GetXmlNames(OrderNumber);

            return Xmlname;
        

正面场景的测试用例 - 我正在发送订单号并获取 2 个 Xml 名称。

 public void RetrieveXmlFileNameTest()
        
            var expected = new List<string>();
            expected.Add("CustomerXmlFileName");
            expected.Add("GeneratedXmlFileName");
            var mock = new Mock<ICosmosDb>();
            mock.Setup(p => p.GetXmlNamesForOrderNumber("100")).Returns(expected);
            RetrieveXmlService retrieveXmlService = new RetrieveXmlService();
            List<string> actual = retrieveXmlService.RetrieveXmlFileName("100");
            Assert.AreEqual(expected, actual);
        

要做的事情 - 如何为负场景创建测试用例 - 如果函数没有返回 Xml 名称(null Xmlname)

【问题讨论】:

mock.Setup(p =&gt; p.GetXmlNamesForOrderNumber("-100")).Returns(null)(或.Returns(new List&lt;string&gt;())? public void RetrieveXmlFileNameTest() var expected = new List&lt;string&gt;(); var mock = new Mock&lt;ICosmosDb&gt;(); mock.Setup(p =&gt; p.GetXmlNamesForOrderNumber("100")).Returns(new List&lt;string&gt;); RetrieveXmlService retrieveXmlService = new RetrieveXmlService(); List&lt;string&gt; actual = retrieveXmlService.RetrieveXmlFileName("100"); Assert.AreEqual(expected, actual); 这个方法我试过了,但是测试用例失败了 【参考方案1】:

您将难以对RetrieveXmlService.RetrieveXmlFileName(string) 进行单元测试,因为该方法正在“实例化”依赖项。无论您如何在单元测试中模拟您的依赖项,它们都将被忽略,因为您正在测试的方法正在创建自己的依赖项。通过构造函数依赖注入,如 here 所述,您可以将依赖关系传递给类以供类方法使用。

我会修改 RetrieveXmlService 的构造函数并传递 IDatabase 依赖项,这样

public class RetrieveXmlService

    private readonly IDatabase _db;

    public RetrieveXmlService(IDatabase db)
    
        _db = db;      
    

    public List<string> RetrieveXmlFileName(string OrderNumber)
    
        var Xmlname = _db.GetXmlNames(OrderNumber);

        return Xmlname;
    

然后您可以按如下方式编写单元测试:

public void RetrieveXmlFileNameTest()

    var expected = new List<string>();
    expected.Add("CustomerXmlFileName");
    expected.Add("GeneratedXmlFileName");
    
    var mock = new Mock<IDatabase>();
    mock.Setup(p => p.GetXmlNames("100")).Returns(expected);
    RetrieveXmlService retrieveXmlService = new RetrieveXmlService(mock);
    
    List<string> actual = retrieveXmlService.RetrieveXmlFileName("100");
    Assert.AreEqual(expected, actual);

您可以通过 Microsoft documentation 了解有关 .NET 中的依赖注入的更多信息

【讨论】:

我可以在不使用构造函数的情况下测试正面场景。对于相同的功能,我需要测试一个负面的场景 肯定的测试用例在这里通过,因为您在IDatabase.GetXmlNames(string) 的实际实现的输出上断言而不是模拟的输出。为了证明这一点,您可以调整正面测试用例中的预期数据,将CustomerXmlFileName 替换为MyMockXmlFileName

以上是关于如何使用 c# 为给定函数创建负 nunit 测试用例的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Nunit进行测试

vs2010中使用Nunit测试c#代码结果的正确性

如何在 NUnit 测试框架上使用 selenium C# 在新的 Chrome 选项卡上打开 url

如何使用 selenium webdriver、NUnit 和 C# 获取元素属性的子属性值

是啥导致在单元测试(NUnit 或 MSTest)中从 C# 调用的 C++ 函数与在控制台应用程序中运行的相同代码产生不同的结果?

通过 NUnit 运行 C++ 代码