테스트를위한 전용 세터가있는 스터 빙 속성


10

우리는 목표를 가지고

public class MyObject{
    protected MyObject(){}

    public string Property1 {get;private set;}
    public string Property2 {get;private set;}
    public string Property3 {get;private set;}
    public string Property4 {get;private set;}
    public string Property5 {get;private set;}
    public string Property6 {get;private set;}
    public string Property7 {get;private set;}
    public string Property8 {get;private set;}
    public string Property9 {get;private set;}
    public string Property10 {get;private set;}
}

프로덕션 코드에서는 automapper를 통해이 객체를 채 웁니다. 속성에 액세스하여 올바르게 설정할 수 있습니다.

향후 파이프 라인에서이 클래스를 테스트하려는 경우 더미 값으로 특성을 채울 수 없습니다 (테스트 대상).

사용 가능한 몇 가지 옵션이 있습니다.

  • 테스트에 필요한 매개 변수를 수락하고 속성을 설정하는 사용자 지정 생성자, 현재 3 개의 생성자가 필요합니다. 생성자가 비즈니스 기능을 제공하지 않기 때문에 이것은 깨끗하지 않습니다.

  • 클래스를 스텁 할 수 있도록 속성을 가상으로 만듭니다. 그러나 속성을 가상으로 표시하면 비즈니스 가치가 제공되지 않으며 내 클래스를 오염시킵니다.

  • 클래스에 오브젝트 빌더를 추가하여 오브젝트를 내부적으로 구성하십시오. 비즈니스 가치가 추가되지 않습니다. 아마도 도메인 객체에서 약간 깨끗하지만 여전히 관련이없는 많은 코드 일 것입니다.

여기에 제안, 조언 또는 대안 옵션이 있습니까?

답변:


8

여러 가지 옵션이 있습니다.

  • 계속해서 사용자 정의 생성자, 가상 속성 또는 객체 작성기를 사용하십시오. 이것의 근거는 객체가 스스로 서 있어야하며 오토 매퍼와 같은 마법에 의존해서는 안된다는 것입니다. 어떤 마술이 진행되지 않는 한 완전히 쓸모없는 수업은 수업에 대한 생각이 아닙니다. "비즈니스 가치"가 좋은 디자인을 결정하는 유일한 요소는 아닙니다.

  • 테스트 프로세스에 오토 매퍼를 포함시킵니다. 어떤 사람들은 이것이 더 이상 단위 테스트가 아니라고 말할 것입니다. 그것은 중요하지 않습니다. 단위 테스트는 유일한 종류의 테스트가 아닙니다 .

  • 테스트를 위해 automapper의 기능을 제공하는 무언가를 구현하십시오. 속성 이름과 값을 포함하는 사전에서 객체를 채우기 위해 리플렉션을 사용하는 작은 유틸리티를 쉽게 작성할 수 있습니다.

또한이 질문과 답변을 살펴보십시오 : 테스트를 위해 비공개 물건을 내부 / 공개로 만들거나 PrivateObject와 같은 일종의 핵을 사용 하시겠습니까?


3

나는 테스트에서 이와 같은 것들에 대해 리플렉션을 사용하는 것을 망설이지 않습니다.

나는 잘못된 이유로 코드를 변경하기 때문에 조롱하기 위해 가상으로 만드는 것을 싫어합니다.

나는 automapper를 모르지만 테스트에 포함시키는 것이 좋은 아이디어 일 수 있다는 @Mike에 동의합니다. 구별 단위 테스트 / 통합 테스트는별로 흥미롭지 않습니다. 테스트 스위트가 커지고 느리게 진행되는 경우, 모든 테스트의 합리적인 서브 세트 만 가장 높은 빈도로 실행하도록 필터링하고 분류해야합니다.

리플렉션을 사용한 샘플 해킹, nameof () 사용하면 성능이 향상되지만 유형이 느슨합니다.

public static class TestExtensions
{
    public static void SetProperty<TSource, TProperty>(
        this TSource source,
        Expression<Func<TSource, TProperty>> prop,
        TProperty value)
    {
        var propertyInfo = (PropertyInfo)((MemberExpression)prop.Body).Member;
        propertyInfo.SetValue(source, value);
    }
}

0

단위 테스트 목적으로 개인 구성원 조롱을 지원하는 Microsoft Fakes, TypeMock 및 JustMock과 같은 조롱 프레임 워크를 사용하십시오.

Smocks (사용 가능한 @nuget 패키지)도 살펴보십시오. 작업복의 제한은 개인 회원에게 액세스를 제공하지 않습니다. 그러나 정적 및 비가 상 구성원을 조롱하는 기능이 있습니다. 또한 무료로 제공됩니다.

또 다른 가장 간단한 방법은 PrivateObject / PrivateType을 사용하는 것입니다.

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