我有一些代码根据我的CodedUI测试项目的属性生成报告。我希望能够将TestCategoryAttribute添加到此报告中,但我不知道如何调整我的代码以允许重复属性,如下所示:
[TestMethod]
[TestCategory("Smoke")]
[TestCategory("Feature1")]
public void CodedUITest()
{
}
当我只有一个TestCategory但不能使用多个测试类别时,下面的代码有效:
//Other code above to find all CodedUI classes and all public, nonstatic methods with the TestMethod attribute
//find method with testcategory attribute
if (attrs.Any(x => x is TestCategoryAttribute))
{
var testcategoryAttr = (TestCategoryAttribute)attrs.SingleOrDefault(x => x is TestCategoryAttribute);
string testCategories = string.Join(", ", testcategoryAttr.TestCategories.Select(v => v.ToString()));
}
答案 0 :(得分:1)
将SingleOrDefault
替换为Where
:
var testcategoryAttrs = attrs.Where(x => x is TestCategoryAttribute)
.Select(x => ((TestCategoryAttribute)x).TestCategory);
string testCategories = string.Join(", ", testcategoryAttrs.ToArray());
我不知道TestCategoryAttribute
中的媒体资源名称,所以我在此示例中使用了TestCategory
。
答案 1 :(得分:0)
SingleOrDefault
会抛出异常。在这种情况下,您有两个属性,这就是您获得异常的原因。
如果您只想获得一个项目,请使用FirstOrDefault
。它返回第一个用条件计算的项,否则它返回 null 所以你在建立FirstOrDefault
的返回结果时应该小心,你可能想在演员之前添加一个空查,由于您使用Any
方法并确保至少存在一个TestCategoryAttribute
,因此在这种情况下不需要进行空检查。
var testcategoryAttr = (TestCategoryAttribute)attrs
.FirstOrDefault(x => x is TestCategoryAttribute);
答案 2 :(得分:0)
这是最终对我有用的解决方案。我问了一个实际的开发人员这个问题,而不是试图弄清楚自己(我是QA):)我必须添加一些特殊的逻辑来正确格式化字符串,因为attr.TestCategories对象是一个List。
//find method with testcategory attribute
if (attrs.Any(x => x is TestCategoryAttribute))
{
var testCategoryAttrs = attrs.Where(x => x is TestCategoryAttribute);
if (testCategoryAttrs.Any())
{
foreach (var testCategoryAttr in testCategoryAttrs)
{
TestCategoryAttribute attr = (TestCategoryAttribute)testCategoryAttr;
testCategories += string.IsNullOrEmpty(testCategories)
? string.Join(", ", attr.TestCategories)
: string.Format(", {0}", string.Join(", ", attr.TestCategories));
}
}
}