当前位置: 首页 > 知识库问答 >
问题:

NUnit-用于测试事务的单元测试用例

余阳秋
2023-03-14

我有一个方法如下。

我想为下面的方法写两个测试用例。

1) 提交数据的成功事务

2) 具有回滚数据的失败事务

我如何写一个涉及事务的测试用例,并成功和失败?

public async Task<List<string>> UpdateRequest(MetaData data, List<string> Ids, string requestedBy)
{
    var transaction = await _databaseUtility.CreateTransaction(ConnectionString);

    var messages = new List<string>();

    try
    {
        // Update data
        await _testDal.Update(data, requestedBy, transaction);

        // Update status
        await _sampleDal.UpdateStatus(Ids, requestedBy, transaction);

        // Update saved data
        await _testDal.UpdateSavedData(data, requestedBy, transaction);

        _databaseUtility.CommitTransaction(transaction);
    }
    catch (Exception exception)
    {
        _databaseUtility.RollbackTransaction(transaction);
    }

    return messages;
}

共有2个答案

笪昌翰
2023-03-14

您可以通过使用NUnit内置的TestCaseSource属性和TestCaseData类来实现它。

[TestCaseSource(nameof(TestCases))]
public List<string> TestTransaction(MetaData data, List<string> ids, string requestedBy)
{
    return testObject.UpdateRequest(data, ids, requestedBy).GetAwaiter().GetResult();
}

public static IEnumerable TestCases
{
    get
    {
        //successful
        yield return new TestCaseData(new MetaData(), new List<string> { "1", "2" }, "test").Returns(new List<string> { "test1", "test2" });
        //failed
        yield return new TestCaseData(null, new List<string> { "1", "2" }, "test").Returns(new List<string> { "test1", "test2" });
        //another failed
        yield return new TestCaseData(new MetaData(), new List<string> { "1", "2" }, string.Empty).Returns(new List<string> { "test1", "test2" });
    }
}

这里有几点

  • 为什么你需要一个List的消息在UpdateRequest方法中?它只是初始化,不添加值。在上面的代码片段中,从UpdateRequest方法返回的消息列表仅与预期结果匹配,但您也可以在此处编写任何Asrett
  • 失败的事务取决于您的逻辑,您可以传递一个导致异常的无效数据,在代码片段中,我使用了空的元数据请求通过
  • 异步任务

作为一个选项,您还可以为成功和失败的事务编写单独的测试,并异步调用UpdateRequest方法。

到目前为止,您还没有共享组件的详细信息,很难对DAL做出假设,但是如果您想为Update方法使用模拟,您可以尝试Moq库和任务。响应/返回值的FromResult方法,如本答案所述

尉迟鸿熙
2023-03-14

我认为你有两个问题:

>

  • 您正在使用async,并在单元测试中等待,这意味着您的代码将在任何事情真正完成之前继续运行。
    您可以阅读https://johnthiriet.com/removing-async-void/#我会解释捕获,确保
    代码>等待_testDal。Update函数返回一个任务。然后你可以用_testDal调用它。更新(数据,请求,事务)。
    wait调用您的常规代码。这将使您的测试代码等待更新完成,而常规代码保持原样。

    我会使用类似NSubstitute的模拟服务https://nsubstitute.github.io/为了模仿这些反应。模拟服务将使用反射替换实现_testDal的接口或类
    通过这种方式,当调用Update()函数时,可以向其传递某些参数,并在将这些参数传递到函数中时引发异常
    并传递另一组参数,并为它们返回正确的消息。

    如果您希望传递不同的参数,您可以使用NUnitTestCase(new[]params...)并将不同的参数集传递给相同的单元测试。

  •  类似资料:
    • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。

    • 英文原文:http://emberjs.com/guides/testing/unit/ 单元测试用于测试代码的一个小片段,确保其功能正常。与集成测试不同,单元测试被限定在一个范围内,并且不需要Ember应用运行。 全局 vs 模块 过去如果没有作为一个全局变量加载整个Ember应用,要对应用进行测试非常困难。通过使用模块(CommonJS,AMD等)来编写应用,可以只加载被测试的部分,而不用将其

    • Spring对MockMvc有2个设置: 独立设置 WebApplication Context安装 一般来说,MockMvc用于哪种测试?单元还是集成?或者两者兼而有之? 使用独立设置(运行在Spring应用程序上下文之外)允许您编写单元测试,而使用WebApplication Context设置您可以编写集成测试,这是对的吗?

    • 我的spark应用程序中有一个方法从MySQL数据库加载数据。该方法看起来如下所示。 该方法除了执行方法并从数据库加载数据外,其他什么都不做。我该如何测试这种方法呢?标准方法是创建对象的模拟,该对象是的实例。但是由于有一个私有构造函数,所以我无法使用Scalamock来模拟它。 这里的主要问题是,我的函数是一个纯粹的副作用函数(副作用是从关系数据库拉数据),如果我在嘲笑时遇到问题,我如何单元测试这

    • 我有一个应用程序,使用经典的Spring配置与xml,它可以使用Spring启动仅用于单元测试? 像这样: