AutoFixture / AutoMoq를 사용하여 깊이 중첩 된 클래스에 대한 모의 생성?

롭 P.

개체 그래프에서 상당히 깊은 일부 읽기 전용 속성을 재정의하는 단위 테스트를 작성하고 싶습니다. 내가 의미하는 것은 다음과 같은 방법입니다.

public string MethodToTest(IClassA classA)
{
    return classA.ClassB.ClassC.ClassD.Items[0].Name;
}

각 ClassN은 인터페이스 IClassN을 구현하고 각 속성은 읽기 전용입니다. 따라서 예제 인터페이스는 다음과 같습니다.

IClassA

public interface IClassA { IClassB ClassB { get; } }

그리고 구현은 다음과 같습니다.

ClassA

public class ClassA : IClassA
{
    public ClassA() { ClassB = new ClassB(); }
    public IClassB ClassB { get; }
}

가능한 한 적은 노력으로 classA.ClassB.ClassC.ClassD.Items [0] .Name 에서 반환 한 값을 재정의하고 싶습니다 . Mock을 만들고 .Setup을 사용하여 IClassB를 반환하고 Moq를 사용하여 전체 체인으로 이동할 수 있습니다. 하지만 가능한 한 피하고 싶습니다.

나는 많은 다른 것을 시도했지만 운이 없었습니다.

시도 # 1

나는 사용하여 체인을 만들 수 있다고 생각했습니다. fixture.Build()

var moqItem = new Mock<IItem>();
moqItem.Setup(item => item.Name).Returns("My expected value");
var fakeClassD = fixture.Build<IClassD>()
                        .With(d => d.Items, new[] { moqItem.Object });

분명히 일부 레이어를 생략했지만 중요하지 않습니다. 속성이 읽기 전용이기 때문에 실패합니다.

시도 # 2

다음으로 나는 특정 인스턴스를 '고정'할 수 있다고 생각했고, 조명기가 객체를 생성 할 때마다 그 유형의 무언가를 본다면 그것을 사용할 것이라고 생각했습니다. 여기에 주어진 예를 따르고 있다고 생각했습니다. https://blog.ploeh.dk/2010/03/17/AutoFixtureFreeze/

다음과 같은 코드를 보여줍니다. var expectedName = fixture.Freeze("Name");

이를 바탕으로 다음과 같이 시도했습니다.

var moqItem = new Mock<IItem>();
moqItem.Setup(x => x.Name).Returns("My expected value");
fixture.Freeze<IItem[]>(new IItem[] { moqItem.Object });

슬프게도 컴파일되지도 않습니다. Freeze 메서드는 IItem [] 유형의 일부 Composer 클래스의 Func를 예상하고 있으며이를 수행하는 방법을 알아낼 수 없었습니다. 유형을 제거하면 샘플 코드와 유사합니다.

fixture.Freeze(new IItem[] { moqItem.Object });

또한 컴파일에 실패합니다.

시도 # 3

var moqItem = new Mock<IItem>();
moqItem.Setup(x => x.Name).Returns("My expected value");
fixture.Inject<IItem[]>(new IItem[] { moqItem.Object });

시도 # 2와 매우 유사합니다.이 경우에만 컴파일됩니다. 조명기가 IItem [] 배열이 필요할 때마다 내가 설정 한 배열을 사용할 것이라고 생각했습니다. 하지만 내가 전화하면

var attempt3 = fixture.Create<IClassA>();

내가 바라던 행동이 아닙니다. attempt3.ClassB.ClassC.ClassD.Items에 모의 항목이 없습니다.

요약- Item[0].Name최소한의 코드 / 노력 으로에서 반환 된 값을 어떻게 재정의 할 수 있습니까?

Nkosi

기본 Moq를 사용하면 다음과 같은 하나의 설정으로 동일한 작업을 수행 할 수 있습니다.

//Arrange
var expected = "My expected value";
var mockA = new Mock<IClassA>();
// auto-mocking hierarchies (a.k.a. recursive mocks)
mockA.Setup(_ => _.ClassB.ClassC.ClassD.Items[0].Name)
    .Returns(expected);

//...

//Act
var actual = subject.MethodToTest(mockA.Object);

//...

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

findIndex를 사용하여 객체의 깊이 중첩 된 배열에서 성능 찾기 및 업데이트

분류에서Dev

깊게 중첩 된 Perl 모듈의 내부 전용 클래스-어색한 이름 지정 방지

분류에서Dev

깊게 중첩 된 속성에 대한 일치 들여 쓰기 줄이기

분류에서Dev

C #을 사용하여 깊게 중첩 된 JSON의 특정 속성에 액세스하고이를 배열에 추가합니다.

분류에서Dev

일반 부모 클래스 내에 중첩 된 클래스 생성자에 대한 함수 참조

분류에서Dev

가장 깊은 중첩 내부의 속성으로 그룹화 된 행을 사용하여 Pandas DataFrame에서 중첩 된 JSON 생성

분류에서Dev

중첩 목록이 줄 끝에 쉼표 만 사용하여 한 수준 더 깊게 중첩 된 이유

분류에서Dev

순서에 따라 깊게 중첩 된 Javascript 객체에서 동일한 이름의 여러 속성 값 변경

분류에서Dev

중첩 된 추상 부모 클래스에서 생성자를 호출하는 문제

분류에서Dev

JAXB 및 Java를 사용하여 여러 계층 수준의 XML 파일에 대한 모델 클래스 생성

분류에서Dev

부모 클래스를 사용하여 중첩 된 div에서 부 트랩 클래스 이름을 바꿔야합니다.

분류에서Dev

SQLAlchemy에 의해 생성되지 않은 테이블에 대한 외래 키를 사용하여 모델 생성

분류에서Dev

런타임에 해결 된 루트 인터페이스를 사용하여 중첩 된 클래스에 종속성을 주입하는 Windsor Castle

분류에서Dev

Androidx 코 틀린 생성 중첩 GSON 데이터 클래스에 필요한, GSON를 사용

분류에서Dev

syncdb는 중첩 된 모델에 대한 테이블을 생성하지 않습니다.

분류에서Dev

PHP 및 mysql을 사용하여 Json 스크립트에서 중첩 된 동일한 구조 테이블 생성

분류에서Dev

대시를 사용하여 중첩 된 JSON 속성에 액세스

분류에서Dev

JSON 기반의 다중 인덱스 계층 적 인덱스를 사용하여 깊이 중첩 된 JSON을 Pandas Dataframe으로 변환

분류에서Dev

이 중첩 된 클래스 생성자 스 니펫을 일반 클래스에 적용 할 수 있습니까?

분류에서Dev

Reflection API를 사용하여 생성 된 최종 클래스의 개체에 대한 전체 복사본을 만드는 방법

분류에서Dev

JavaFX Bind UI를 중첩 된 클래스의 속성에 연결

분류에서Dev

중첩 된 사전의 임의 깊이에서 키 삭제

분류에서Dev

OpenXML SDK를 사용하여 생성 된 DOCX의 목차에 대한 페이지 번호 자동 업데이트

분류에서Dev

Rails 4에서 JQuery를 사용하여 하나의 형태로 중첩 된 객체 생성

분류에서Dev

키에 대한 변수를 사용하여 중첩 된 개체의 요소에 액세스합니까?

분류에서Dev

AutoFixture를 사용하여 제한된 문자 집합 중 하나로 개체 속성 채우기

분류에서Dev

현재의 클래스의 비 생성 된 클래스를 사용하여

분류에서Dev

Java의 itext 라이브러리를 사용하여 병합 된 PDF에 대한 색인 파일 (TOC) 생성

분류에서Dev

private 멤버를 사용하여 파생 클래스에 대한 이동 생성자를 구현하는 방법

Related 관련 기사

  1. 1

    findIndex를 사용하여 객체의 깊이 중첩 된 배열에서 성능 찾기 및 업데이트

  2. 2

    깊게 중첩 된 Perl 모듈의 내부 전용 클래스-어색한 이름 지정 방지

  3. 3

    깊게 중첩 된 속성에 대한 일치 들여 쓰기 줄이기

  4. 4

    C #을 사용하여 깊게 중첩 된 JSON의 특정 속성에 액세스하고이를 배열에 추가합니다.

  5. 5

    일반 부모 클래스 내에 중첩 된 클래스 생성자에 대한 함수 참조

  6. 6

    가장 깊은 중첩 내부의 속성으로 그룹화 된 행을 사용하여 Pandas DataFrame에서 중첩 된 JSON 생성

  7. 7

    중첩 목록이 줄 끝에 쉼표 만 사용하여 한 수준 더 깊게 중첩 된 이유

  8. 8

    순서에 따라 깊게 중첩 된 Javascript 객체에서 동일한 이름의 여러 속성 값 변경

  9. 9

    중첩 된 추상 부모 클래스에서 생성자를 호출하는 문제

  10. 10

    JAXB 및 Java를 사용하여 여러 계층 수준의 XML 파일에 대한 모델 클래스 생성

  11. 11

    부모 클래스를 사용하여 중첩 된 div에서 부 트랩 클래스 이름을 바꿔야합니다.

  12. 12

    SQLAlchemy에 의해 생성되지 않은 테이블에 대한 외래 키를 사용하여 모델 생성

  13. 13

    런타임에 해결 된 루트 인터페이스를 사용하여 중첩 된 클래스에 종속성을 주입하는 Windsor Castle

  14. 14

    Androidx 코 틀린 생성 중첩 GSON 데이터 클래스에 필요한, GSON를 사용

  15. 15

    syncdb는 중첩 된 모델에 대한 테이블을 생성하지 않습니다.

  16. 16

    PHP 및 mysql을 사용하여 Json 스크립트에서 중첩 된 동일한 구조 테이블 생성

  17. 17

    대시를 사용하여 중첩 된 JSON 속성에 액세스

  18. 18

    JSON 기반의 다중 인덱스 계층 적 인덱스를 사용하여 깊이 중첩 된 JSON을 Pandas Dataframe으로 변환

  19. 19

    이 중첩 된 클래스 생성자 스 니펫을 일반 클래스에 적용 할 수 있습니까?

  20. 20

    Reflection API를 사용하여 생성 된 최종 클래스의 개체에 대한 전체 복사본을 만드는 방법

  21. 21

    JavaFX Bind UI를 중첩 된 클래스의 속성에 연결

  22. 22

    중첩 된 사전의 임의 깊이에서 키 삭제

  23. 23

    OpenXML SDK를 사용하여 생성 된 DOCX의 목차에 대한 페이지 번호 자동 업데이트

  24. 24

    Rails 4에서 JQuery를 사용하여 하나의 형태로 중첩 된 객체 생성

  25. 25

    키에 대한 변수를 사용하여 중첩 된 개체의 요소에 액세스합니까?

  26. 26

    AutoFixture를 사용하여 제한된 문자 집합 중 하나로 개체 속성 채우기

  27. 27

    현재의 클래스의 비 생성 된 클래스를 사용하여

  28. 28

    Java의 itext 라이브러리를 사용하여 병합 된 PDF에 대한 색인 파일 (TOC) 생성

  29. 29

    private 멤버를 사용하여 파생 클래스에 대한 이동 생성자를 구현하는 방법

뜨겁다태그

보관