클래스에 속성이 있는지 테스트 하시겠습니까?


101

나는 약간의 Test-First 개발을 시도하고 있으며 내 클래스가 속성으로 표시되어 있는지 확인하려고합니다.

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

클래스에 해당 속성이 할당되어 있는지 단위 테스트하려면 어떻게해야합니까?

답변:


123

확인

Attribute.GetCustomAttribute(typeof(ScheduleController),
    typeof(SubControllerActionToViewDataAttribute))

null ( Assert.IsNotNull또는 유사)이 아님

( IsDefined대부분 내가 속성의 일부 속성을 확인하고 싶기 때문입니다 ....)


6
일반적으로 매개 변수없는 / 속성없는 속성에 필요한 모든 속성 인 속성이 있는지 확인하려면 .IsDefined를 사용하는 것이 더 저렴합니다. .IsDefined는 메타 데이터를 쿼리하고 속성 개체를 역 직렬화 및 인스턴스화하지 않기 때문입니다.
Lasse V. Karlsen

1
IsDefined가 더 저렴하다는 점은 ...하지만 대부분의 경우 (특히 단위 테스트)에서 차이를 눈치 채지 못할 것입니다. 프로덕션 코드에서 타이트한 루프 였다면 ...
Marc Gravell

@ Marc- 단위 테스트에서 성능 차이가 눈에 띄지 않을 것이라는 데 동의합니다. 필요한 경우 속성을 얻을 수 있는데, 이는 대부분의 경우 시나리오입니다. 최근에 정렬 가능한 필드의 드롭 다운에서 열을 제외하기 위해 작성중인 프레임 워크에서 IsDefined를 사용했습니다. 이것은 속성 자체에 사용할 필요가 없었기 때문에 잘 작동했습니다.
RichardOD

방법에 대해 동일한 것을 어떻게 테스트 할 수 있습니까?
Manvinder Singh

80

일반적으로 클래스의 속성을 확인하는 것과 동일합니다.

다음은 몇 가지 샘플 코드입니다.

typeof(ScheduleController)
.IsDefined(typeof(SubControllerActionToViewDataAttribute), false);

나는 많은 경우에 단위 테스트에서 속성의 존재를 테스트하는 것이 잘못되었다고 생각합니다. MVC contrib의 하위 컨트롤러 기능을 사용하지 않았기 때문에이 경우에 적절한 지 언급 할 수 없습니다.


+1 한 후 오류를 발견했습니다. .IsDefined (typeof (Type), false);
Alexander Beletsky 2012

@alexanderb 물론 맞습니다. 나는 지금 내 대답을 업데이트했습니다. 나는 당시 컴파일러에 대한 내 대답을 확인하지 않아야합니다! 덕분에 오류를 지적
RichardOD

10
이 방법은 빨리 다음 이전이다
슬라바

18

이것에 제네릭을 사용할 수도 있습니다.

var type = typeof(SomeType);
var attribute = type.GetCustomAttribute<SomeAttribute>();

이렇게 typeof(...)하면 코드를 더 깔끔하게 만들 수있는 다른 .


이것은 나를 위해 작동하지 않습니다. 어떤 using.. 내가 놓친 거지?

@Scanzy 잘 모르겠습니다. IDE를 사용하고 있지 않습니까? (보통 그들은 올바른 것을 제안합니다 using) 어떤 오류가 발생합니까?
Kroltan

1
좋아, 여기에 내가 찾은 GetCustomAttribute<SomeAttribute>방법은 .NET 4.5에서 사용 가능한이고 모든 것이 분명 해졌다 그래서 내 IDE가 3.5로 설정

9

나는이 쓰레드가 정말 오래 되었다는 것을 알고 있지만 누군가가 우연히 발견하면 유창한 주장 프로젝트가 이런 종류의 주장을 수행하는 데 매우 편리 하다는 것을 알 수 있습니다 .

typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.