개체 그래프에서 상당히 깊은 일부 읽기 전용 속성을 재정의하는 단위 테스트를 작성하고 싶습니다. 내가 의미하는 것은 다음과 같은 방법입니다.
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
최소한의 코드 / 노력 으로에서 반환 된 값을 어떻게 재정의 할 수 있습니까?
기본 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] 삭제
몇 마디 만하겠습니다