【问题标题】:How to create negative nunit test case for the given function using c#如何使用 c# 为给定函数创建负 nunit 测试用例
【发布时间】: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); }这个方法我试过了,但是测试用例失败了

标签: c# .net unit-testing .net-core nunit


【解决方案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
猜你喜欢
  • 2015-07-26
  • 2010-12-31
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多