使用Moq、NUnit和Shoulded进行单元测试

目录

介绍

背景

使用代码

具有保存的输入参数和输出的单元测试复杂函数


介绍

如今,当应用程序变得越来越复杂时,开发人员很难在创建或编辑功能时检查所有方案。因此,必须有一个单独的单元测试项目,以确保满足所有所需的功能参数并且不会遗漏任何内容。为此,有时会模拟数据,并应用条件断言来验证功能需求。这篇文章将告诉你如何使用MoqNUnit Shouldly.NET应用程序中实现单元测试。

背景

NUnit已经存在了很长时间,但是某些关键功能必须是缺少的,即数据模拟,其中来自一些外部功能的响应将使用Moq来模拟,以测试给定的功能和Shouldly ,使断言更容易理解和更有意义。

MoqShouldly都提供了NuGet包。

使用代码

为了说明如何模拟功能,Moq用于设置给定功能以根据某些条件返回预定义的响应。

Shouldly提供现成的包装器功能以断言可接受的条件。

[Test]
public void TestGetRailwayStationById()
{
    var mockClassBll = new Mock<IBll>();
    mockClassBll.Setup(c => c.GetRailwayStationById(It.IsAny<int>()))
        .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<IBll>();
    mockClassBll.Setup(c => c.GetRailwayStationByName(It.IsAny<string>()))
        .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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值