나는 FakeItEasy와 Castle Windsor 모두에서 매우 멍청한 데, 그것이 내가 검색 할 키워드를 모르기 때문에 Google 검색에서도 문제가있는 이유입니다.
이제 문제에 온다
수업이 있어요
public class PersonService : IPersonService
{
IMarriageHelper objIMarriageHelper;
IPersonRepository objIPersonRepository;
public PersonService(IMarriageHelper objMarriageHelper, IPersonRepository objPersonRepository)
{
this.objIMarriageHelper = objMarriageHelper;
this.objIPersonRepository = objPersonRepository;
}
}
이제 Castle Windsor를 사용하여 단위 테스트 케이스에서 PersonService 클래스를 해결합니다.
var objContainer = new WindsorContainer();
objContainer.Register(Component.For<PersonService>());
objContainer.Register(Component.For<IMarriageHelper>().ImplementedBy<MarriageHelper>());
objContainer.Register(Component.For<IPersonRepository>().ImplementedBy<PersonRepository>());
var objPersonService = objContainer.Resolve<PersonService>();
이제 문제는 PersonService를 해결하지만 MarraigeHelper가 아닌 PersonRepository의 가짜 객체를 보내고 싶다는 것입니다.
나는 이것에 매우 익숙하기 때문에 이걸로 나를 도울 수 있습니다.
Castle Windsor에서 동일한 인터페이스에 여러 구성 요소를 등록하면 Windsor가 첫 번째 구성 요소 또는 Default ()로 표시된 구성 요소를 확인합니다.
문제를 해결하는 방법에는 여러 가지가 있습니다. 그중 몇 개만 지적하겠습니다.
이름을 사용한 등록 :
const string FAKE_REPOSITORY = "fake person repo";
var fakePersonRepository = A.Fake<IPersonRepository>();
objContainer.Register(Component.For<IPersonRepository>()
.Instance(fakePersonRepository)
.Named(FAKE_REPOSITORY));
const string PERSON_FOR_TEST = "person for test";
objContainer.Register(Component.For<PersonService>()
.DependsOn(Dependency.OnComponent(typeof(IPersonRepository), FAKE_REPOSITORY))
.Named(PERSON_FOR_TEST));
그리고이 사람 서비스 해결 :
var target = objContainer.Resolve<PersonService>(PERSON_FOR_TEST);
또 다른 옵션은 만드는 것입니다 PersonService
의 DependsOn 동적 매개 변수를 사용하면 해결이 시나리오 PersonService
와fakePersonRepository
var target = objContainer.Resolve<PersonService>(<key name>, fakePersonRepository)
3 ~ 4 개 이상의 옵션 (공장 방법, 이러한 방법 간의 조합 등)에 대해 생각할 수 있지만 PersonService
테스트 를 위해 빌드하는 가장 좋은 방법 은 윈저 매직을 사용하지 않고 명시 적으로 빌드하거나 해결을 위해서만 윈저를 사용하는 것이라고 생각합니다. IMarriageHelper
. 그러면 코드가 훨씬 더 읽기 쉽고 유지 관리가 쉽습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다