팀에서 구현하고있는 단위 테스트와 관련하여 점점 성가신 문제로 어려움을 겪고 있습니다. 우리는 잘 설계되지 않은 레거시 코드에 단위 테스트를 추가하려고 시도하고 실제로 테스트를 추가하는 데 어려움이 없었지만 테스트가 어떻게 진행되는지에 어려움을 겪고 있습니다.
문제의 예로, 실행의 일부로 5 개의 다른 메서드를 호출하는 메서드가 있다고 가정 해 봅시다. 이 방법에 대한 테스트는 이러한 5 가지 다른 방법 중 하나의 결과로 동작이 발생하는지 확인하는 것입니다. 따라서 단위 테스트는 한 가지 이유만으로 실패하기 때문에 이러한 다른 4 가지 메소드를 호출하여 발생하는 잠재적 인 문제를 제거하고이를 모방하려고합니다. 큰! 단위 테스트가 실행되고, 조롱 된 메소드가 무시되고 (다른 단위 테스트의 일부로 동작이 확인 될 수 있음) 확인이 작동합니다.
그러나 새로운 문제가 있습니다-단위 테스트는 미래에 다른 4 가지 방법으로 동작과 서명이 변경되었음을 확인하는 방법에 대한 친밀한 지식 또는 '부모 방법'에 추가 해야하는 새로운 방법이 있습니다. 가능한 실패를 피하기 위해 단위 테스트를 변경해야합니다.
당연히 더 많은 방법으로 더 적은 행동을하게함으로써 문제를 다소 완화 할 수 있었지만 아마도 더 우아한 솔루션이 가능하기를 바랐습니다.
다음은 문제를 포착하는 예제 유닛 테스트입니다.
빠른 참고로 'MergeTests'는 테스트중인 클래스에서 상속하고 필요에 따라 동작을 무시하는 단위 테스트 클래스입니다. 이것은 외부 클래스 / 종속성에 대한 호출을 재정의 할 수 있도록 테스트에서 사용하는 '패턴'입니다.
[TestMethod]
public void VerifyMergeStopsSpinner()
{
var mockViewModel = new Mock<MergeTests> { CallBase = true };
var mockMergeInfo = new MergeInfo(Mock.Of<IClaim>(), Mock.Of<IClaim>(), It.IsAny<bool>());
mockViewModel.Setup(m => m.ClaimView).Returns(Mock.Of<IClaimView>);
mockViewModel.Setup(
m =>
m.TryMergeClaims(It.IsAny<Func<bool>>(), It.IsAny<IClaim>(), It.IsAny<IClaim>(), It.IsAny<bool>(),
It.IsAny<bool>()));
mockViewModel.Setup(m => m.GetSourceClaimAndTargetClaimByMergeState(It.IsAny<MergeState>())).Returns(mockMergeInfo);
mockViewModel.Setup(m => m.SwitchToOverviewTab());
mockViewModel.Setup(m => m.IncrementSaveRequiredNotification());
mockViewModel.Setup(m => m.OnValidateAndSaveAll(It.IsAny<object>()));
mockViewModel.Setup(m => m.ProcessPendingActions(It.IsAny<string>()));
mockViewModel.Object.OnMerge(It.IsAny<MergeState>());
mockViewModel.Verify(mvm => mvm.StopSpinner(), Times.Once());
}
당신의 나머지는 이것을 어떻게 다루었습니까? 아니면 그것을 처리하는 훌륭한 '간단한'방법이 없습니까?
업데이트-모든 사람의 의견에 감사드립니다. 불행히도, 놀랍지도 않고, 테스트되는 코드가 열악한 경우 단위 테스트에서 따를 수있는 훌륭한 솔루션, 패턴 또는 연습이없는 것 같습니다. 나는이 단순한 진실을 가장 잘 포착 한 답을 표시했다.