Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# xUnit正在向CollectionDefinition添加特性_C#_Xunit_Xunit.net - Fatal编程技术网

C# xUnit正在向CollectionDefinition添加特性

C# xUnit正在向CollectionDefinition添加特性,c#,xunit,xunit.net,C#,Xunit,Xunit.net,在xUnit和Visual Studio中,我想在测试资源管理器中对标有[Collection(“DB”)]属性的测试进行分组。我只能通过[Trait(“Collection”,“DB”)]属性对测试进行分组。是否有任何方法可以将特定的特征分配给具有[Collection(“DB”)]属性的所有测试 更新:我添加了xUnit问题。从中复制 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用Xunit; 使用Xunit.抽象; 使用Xunit

在xUnit和Visual Studio中,我想在测试资源管理器中对标有
[Collection(“DB”)]
属性的测试进行分组。我只能通过
[Trait(“Collection”,“DB”)]
属性对测试进行分组。是否有任何方法可以将特定的
特征
分配给具有
[Collection(“DB”)]
属性的所有测试

更新:我添加了xUnit问题。

从中复制

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用Xunit;
使用Xunit.抽象;
使用Xunit.Sdk;
使用XUnitCategories示例特征;
命名空间XunitCategoriesSample.Traits
{
公共类类别发现者:ITraitDiscoverer
{
public const string KEY=“Category”;
公共IEnumerable GetTraits(IAttributeInfo TraitatAttribute)
{
var ctorArgs=traitAttribute.GetConstructorArguments().ToList();
返回新的KeyValuePair(键,参数[0].ToString());
}
}
//注意:请注意,您必须在此处提供适当的命名空间
[TraitDiscoveryr(“XunitCategoriesSample.Traits.CategoryDiscoveryr”,“XunitCategoriesSample”)]
[AttributeUsage(AttributeTargets.Method,AllowMultiple=true)]
公共类CategoryAttribute:属性,ITraitAttribute
{
公共类别属性(字符串类别){}
}
}
命名空间XunitCategoriesSample
{
公共班级1
{
[事实]
[类别(“求职者”)]
public void PassingTest()
{
等于(4,加上(2,2));
}
[事实]
[类别(“雇主”)]
公共无效失败测试()
{
等于(5,加上(2,2));
}
整数相加(整数x,整数y)
{
返回x+y;
}
}
}
注意您必须在TraitDiscoverer属性中提供正确的名称空间

但这里还有更多,让我们制作更专业的属性:

public class JobsearcherTraitDiscoverer : ITraitDiscoverer
{
    public const string VALUE = "Jobsearcher";

    public IEnumerable<KeyValuePair<string, string>> GetTraits(IAttributeInfo traitAttribute)
    {
        yield return new KeyValuePair<string, string>(CategoryDiscoverer.KEY, VALUE);
    }
}

[TraitDiscoverer("XunitCategoriesSample.Traits.JobsearcherTraitDiscoverer", "XunitCategoriesSample")]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class JobsearcherTraitAttribute : Attribute, ITraitAttribute
{
    public JobsearcherTraitAttribute()
    {
    }
}
public class JobsearcherTraitDiscoverer:ITraitDiscoverer
{
public const string VALUE=“Jobsearcher”;
公共IEnumerable GetTraits(IAttributeInfo TraitatAttribute)
{
返回新的KeyValuePair(CategoryDiscoverer.KEY,VALUE);
}
}
[TraitDiscoveryr(“XunitCategoriesSample.Traits.JobsearcherTraitDiscoveryr”,“XunitCategoriesSample”)]
[AttributeUsage(AttributeTargets.Method,AllowMultiple=true)]
公共类JobsearcherTraitAttribute:属性,ITraitAttribute
{
公共工作搜索属性()
{
}
}
因此,从现在起,您只需键入
[JobsearcherTrait]

链接:

-关于为什么TraitatAttribute标记为密封的讨论

-xunit示例如何创建自定义属性

-再来一个样品

-实现自定义属性的xunit测试示例

您可以执行以下操作:

enum Collection {
  DB,
  File,
  // Others
}
然后在类或方法级别:

[Trait(nameof(Collection), nameof(Collection.DB))]

简洁明了

这绝对是一项功能要求。但是,不确定您将在哪里停止,还有其他属性,您可以考虑外部属性,或者您可能希望再次匹配的任何模式(例如命名约定)。在traits视图中会出现组合爆炸,而没有用户界面来选择所需内容。最终,向VS团队请求测试资源管理器的功能(即,为测试指定丰富查询的方法)可能比xUnit的功能更重要,这稍微简化了问题,但并不能解决问题。我仍然需要标记方法
[Category(“DB”)][Collection(“DB”)]
。注意,
Collection
是一个特殊用途的xUnit属性。我认为可以通过代码生成来实现这一点:如果类是属性化的,则将额外的
[Category(“DB”)]
附加到所有方法中。但我认为在一般情况下不值得这么做。请求功能请求更合适。
集合
在哪里?如果您真的需要指定“集合”,您可以使用“集合”而不是“TestCategory”,就像我刚才编辑“答案”所做的那样。…问题中的
集合
是xUnit属性,请参阅。不仅仅是一个特征名称。我只是给出了另一种面对/解决问题的方法。问题是关于使用CollectionAttribute进行分组测试,这不是它的目的。也许同时使用这两个属性(如果需要单个测试上下文和共享测试)是正确的选择。
[Trait(nameof(Collection), nameof(Collection.DB))]