如何使用 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 => p.GetXmlNamesForOrderNumber("-100")).Returns(null)
(或.Returns(new List<string>())
?
public void RetrieveXmlFileNameTest() var expected = new List<string>(); var mock = new Mock<ICosmosDb>(); mock.Setup(p => p.GetXmlNamesForOrderNumber("100")).Returns(new List<string>); RetrieveXmlService retrieveXmlService = new RetrieveXmlService(); List<string> 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 测试框架上使用 selenium C# 在新的 Chrome 选项卡上打开 url
如何使用 selenium webdriver、NUnit 和 C# 获取元素属性的子属性值
是啥导致在单元测试(NUnit 或 MSTest)中从 C# 调用的 C++ 函数与在控制台应用程序中运行的相同代码产生不同的结果?