目录
介绍
背景
使用代码
具有保存的输入参数和输出的单元测试复杂函数
- 下载源2.3 MB
如今,当应用程序变得越来越复杂时,开发人员很难在创建或编辑功能时检查所有方案。因此,必须有一个单独的单元测试项目,以确保满足所有所需的功能参数并且不会遗漏任何内容。为此,有时会模拟数据,并应用条件断言来验证功能需求。这篇文章将告诉你如何使用Moq,NUnit 和Shouldly在.NET应用程序中实现单元测试。
背景NUnit已经存在了很长时间,但是某些关键功能必须是缺少的,即数据模拟,其中来自一些外部功能的响应将使用Moq来模拟,以测试给定的功能和Shouldly ,使断言更容易理解和更有意义。
Moq和Shouldly都提供了NuGet包。
使用代码为了说明如何模拟功能,Moq用于设置给定功能以根据某些条件返回预定义的响应。
Shouldly提供现成的包装器功能以断言可接受的条件。
[Test]
public void TestGetRailwayStationById()
{
var mockClassBll = new Mock();
mockClassBll.Setup(c => c.GetRailwayStationById(It.IsAny()))
.Returns(new RailwayStationDs(1, "New Delhi"));
var objRailwayStation = new RailwayStation(mockClassBll.Object);
var result = objRailwayStation.GetRailwayStationById(1);
result.ShouldNotBeNull();
result.StationName.ShouldNotBeEmpty();
}
[Test]
public void TestGetRailwayStationByString()
{
var mockClassBll = new Mock();
mockClassBll.Setup(c => c.GetRailwayStationByName(It.IsAny()))
.Returns(new RailwayStationDs(1, "New Delhi"));
var objRailwayStation = new RailwayStation(mockClassBll.Object);
var result = objRailwayStation.GetRailwayStationByName("New Delhi");
result.ShouldNotBeNull();
result.StationId.ShouldBeGreaterThan(0);
}
具有保存的输入参数和输出的单元测试复杂函数
在应用程序中,很少有非常复杂的函数会根据其中的许多情况返回不同的结果,因此很难检查所有这些情况,因此,对这些函数进行单元测试的最佳方法是保存所有输入参数及其期望输出值。这样的测试数据可以保存在数据库中或XML文件中,并且可以在单元测试中一次又一次地使用以验证所有情况。此类测试数据最适合于在编辑此类复杂功能并且不知不觉中一个或多个案例的功能发生更改并返回错误结果的情况下的条件。
[TestMethod]
[DataSource("System.Data.SqlClient",
@"Data Source=SAURABH\ADVANCE;Initial Catalog=TestDB;
Integrated Security=True", "dbo.StatusTestData",
DataAccessMethod.Sequential)]
public void TestStatusDataDrivenSQL()
{
TestContext.ShouldNotBeNull();
var strTime = TestContext.DataRow["Time"].ToString();
var varTime = TimeSpan.Parse(strTime);
var varStatus = TestContext.DataRow["Status"].ToString();
var objBll = new ClassBLL1();
var result = objBll.CurrentStatus(varTime);
result.ShouldNotBeNullOrEmpty();
result.ShouldBe(varStatus);
}
[TestMethod]
[DeploymentItem(".\\UnitTestBLL\\XMLTestCases.xml")]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
@"XMLTestCases.xml", "case", DataAccessMethod.Sequential)]
public void TestStatusDataDrivenXML()
{
TestContext.ShouldNotBeNull();
var strTime = TestContext.DataRow["Time"].ToString();
var varTime = TimeSpan.Parse(strTime);
var varStatus = TestContext.DataRow["Status"].ToString();
var objBll = new ClassBLL1();
var result = objBll.CurrentStatus(varTime);
result.ShouldNotBeNullOrEmpty();
result.ShouldBe(varStatus);
}