2014-04-18 2 views
0

내 CodedUI 테스트 프로젝트의 특성을 기반으로 보고서를 생성하는 코드가 있습니다.중복 된 메소드에 대한 속성 값을 어떻게 얻을 수 있습니까?

[TestMethod] 
[TestCategory("Smoke")] 
[TestCategory("Feature1")] 
public void CodedUITest() 
{ 
} 

아래의 코드 내가 하나 TestCategory을 가지고 있지만 때 작동 :이 보고서에 TestCategoryAttribute를 추가 할 수 있도록하지만 다음과 같은 중복 속성 수 있도록 내 코드에 적응하는 방법을 모른다 하지 위의 여러 테스트 범주 작업 :

//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())); 
} 
+2

정말로 'SingleOrDefault'를 요청하고 여러 항목을 가져올 수 없습니다. 정확히 무엇이 필요한지 잘 모르지만'SingleOrDEfault'가 아닙니다. –

답변

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)); 
     } 
    }        
} 
1

Where으로 SingleOrDefault 교체 :

var testcategoryAttrs = attrs.Where(x => x is TestCategoryAttribute) 
          .Select(x => ((TestCategoryAttribute)x).TestCategory); 
string testCategories = string.Join(", ", testcategoryAttrs.ToArray()); 

TestCategoryAttribute에있는 재산 이름을 모릅니다. 따라서이 샘플에서는 TestCategory을 사용했습니다.

+0

ToArray()가 실제 값이 아닌 객체 유형의 목록을 생성했기 때문에 you 솔루션이 제대로 작동하지 않았습니다. – PBMax

+0

매우 이상합니다. 'testcategoryAttrs'를'var' 대신'IEnumerable '으로 재 선언하십시오. 그리고 내 샘플의 'TestCategory' 속성을 속성의 데이터 문자열을 반환하는 실제 속성 이름으로 대체했는지 확인하십시오. – Dmitry

0

SingleOrDefault은 조건에 맞는 항목이 두 개 이상있는 경우 예외를 throw합니다.이 경우 두 가지 특성이 있으므로 예외가 발생합니다.

하나의 항목 만 가져 오려면 FirstOrDefault을 사용하십시오. 조건과 일치하는 첫 번째 항목을 반환합니다. 그렇지 않으면 null을 반환하므로 FirstOrDefault의 결과를 캐스팅 할 때주의해야합니다. Any 메서드를 사용하고 있으므로 캐스팅 전에 null 체크를 추가 할 수 있습니다. 적어도 하나는 TestCategoryAttribute이며,이 경우에는 널 확인이 필요하지 않습니다.

var testcategoryAttr = (TestCategoryAttribute)attrs 
         .FirstOrDefault(x => x is TestCategoryAttribute); 
관련 문제