使用xUnit 2.4.1,我正在寻找一种方法,使其在动态跳过集成测试时达到我的要求.

我知道xUnit不是为集成测试而设计的,但我无意将xUnit用于某些测试,将Not个xUnit用于其他测试.我认为单元测试和集成测试之间的区别对于测试运行者来说是非常无用的.

有了这些,我有了一些依赖于数据库的测试.我在测试中添加了以下特征.

public class Some_database_interaction
{
    [Fact]
    [Trait("Demand", "SqlServer")]
    public async Task One_thing_is_inserted()
    {
        using var connection = await Connect();
        var applicationService = new SomeService(connection);
        
        var resultCount = await applicationService.DoTheImportantThing("some args", true);

        Assert.Equal(1, resultCount);
    }
}

目前,当我不想运行依赖于数据库的测试时,我使用命令跳过这些测试.

dotnet test --filter Demand!=SqlServer

这可以在CI管道中使用,但我不能期望团队成员每次都键入此命令.

相反,我想要某种方式来检测功能,然后在需求未得到满足时跳过测试.不过我不知道怎么做.

到目前为止,我最好的try 是以捕捉错误和短路测试的形式为测试添加噪声.

SqlConnection connection;
try
{
    connection = await Connect();
}
catch
{
    // Exit the test
    return;
}

using connection;
var applicationService = new SomeService(connection);

但这有一个不希望的副作用,即显示测试成功而不是被跳过.

有没有关于从这里go 哪里的提示?我知道xUnit 3会有断言.Skip(),但目前我仍停留在xUnit 2上.

推荐答案

这里是另一个基于How do I skip specific tests in xUnit based on current platform的try ,我认为它符合你的需要.

它涉及从FactAttribute派生一个类,该类可以根据连接是否可用设置其Skip属性.

using System;
using Xunit;

namespace SO73109781_skipping_unit_tests
{
    public class ConnectionUnitTests
    {
        [FactSkippedOnNoConnection]
        public void MyUnitTest()
        {
            Assert.Equal(1, 1);
        }
    }

    public class FactSkippedOnNoConnectionAttribute : FactAttribute
    {
        public FactSkippedOnNoConnectionAttribute()
        {
            try
            {
                // Simulate no connection by throwing here
                throw new Exception();
                // connection = await Connect();
            }
            catch
            {
                Skip = "No connection";
            }
        }
    }
}

当方法到达catch时,它设置Skip属性,测试被跳过并在测试浏览器中显示.当try成功时,运行测试.

Csharp相关问答推荐

如何使用PDFSharp将文本添加到现有PDF

C# uwp中的Win11启动屏幕剪辑工作方式不同

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

如何使用XmlSerializer反序列化字符串数组?

如何分配对象后的class的属性?

C#.NET依赖项注入顺序澄清

返回TyedResults.BadRequest<;字符串>;时问题详细信息不起作用

方法从数据表中只 Select 一个条件?

Unix上的.NET(核心):.NET意外地未看到通过P/Invoke系统调用对环境变量进行的进程内修改

有没有类似于扩展元素的合并元组的语法?

是否有必要在ASP.NET Core中注册可传递依赖项?

EF核心区分大小写的主键

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

避免只读记录 struct 中的防御副本

如何使用用于VS代码的.NET Maui扩展在我的iOS/Android设备或模拟器上进行调试?

此异步方法在重写方法中缺少等待运算符警告

Xamarin.Forms-如何创建可 Select 的显示alert 或弹出窗口?

Xamarin.Forms中具有类似AspectFill的图像zoom 的水平滚动视图

实体框架允许您具有筛选的属性吗?