문제

사용자가 이벤트 페이지에 이메일 주소를 입력 할 때 이벤트 알림을 추가해야합니다. 이벤트는 또 다른 도메인 객체입니다. 우리의 초기 생각은 고객 도메인 개체 및 관련 고객 서비스를 만드는 것이 었습니다.

public class CustomerService {
    public void AddEventReminder(string emailAddress, int eventId) {
       var customer = new Customer(emailAddress);
       customer.AddEmailReminder(eventId);
    }
}

단위 테스트에서 AddEmailReminder 메소드가 실제로 새로운 고객에게 요청되었음을 어떻게 확인할 수 있습니까?

내 생각:

  1. 공장을 사용하여 고객을 만듭니다. 나는 당신이 물체 생성에 약간의 복잡성이 있었던 공장을 사용해야한다고 생각했기 때문에 이것은 냄새가납니다.
  2. 나쁜 코드. 더 좋은 방법이 있을까요?
  3. 모크 매직.

별도의 메모 (아마도 관련이있을 수 있음)에서, 우리는 여기서 집계 루트가 어떤 것을 결정합니까? 우리는 고객이 임의로 결정했지만 이벤트 일 수 있습니다. 나는 집계 뿌리에 관한 기사를 읽고 이해했지만이 시나리오에서는 확실하지 않습니다.

도움이 되었습니까?

해결책

이와 같은 경우 서비스에서 고객을 생성하는 보호 된 방법을 작성하고 테스트에서 해당 메소드를 익명의 내부 클래스로 무시하고 모의 고객 개체를 반환합니다. 그런 다음 AddEmailReminder가 호출 된 Mock 고객 객체를 확인할 수 있습니다. 같은 것 :

public class CustomerService {
    public void AddEventReminder(string emailAddress, int eventId) {
       var customer = createCustomer(emailAddress);
       customer.AddEmailReminder(eventId);
    }

    protected Customer createCustomer(string emailAddress) {
       return new Customer(emailAddress);
    }
}

그리고 시험에서 (제한된 C# 지식을 가정하지만 요점을 설명해야합니다) :

void testCustomerCreation() {
    /* final? */ Customer mockCustomer = new Customer("email");
    CustomerService customerService = new CustomerService() {
       protected Customer createCustomer(string emailAddress) {
           return mockCustomer;
       }            
    };

    customerService.AddEventReminder("email", 14);

    assertEquals(mockCustomer.EventReminder() /* ? */, 14);
}

다른 팁

고객 서비스 API에 대한 생각

고객 서비스 에서이 작업을 캡슐화하기로 결정한 특별한 이유가 있습니까? 이것은 조금 보입니다 빈혈 나에게. 대신 고객에게 직접 캡슐화 될 수 있습니까?

아마도 당신은 물건을 단순화하기 위해 고객 서비스 코드 예제를 배제했습니다 ...

그러나 고객 인스턴스를 취하도록 서명을 변경해야합니다. 문제가 해결됩니다.

public void AddEventReminder(Customer customer, int eventId)

그러나 다시, int32는 도메인 객체로 거의 자격이 없으므로 서명은 실제로

public void AddEventReminder(Customer customer, Event event)

문제는 이제이 방법이 값을 전혀 추가하는지 여부입니다.

집계 루트는 무엇입니까?

그들 중 누구도 생각할 것입니다. 집계 루트는 어린이를 관리한다는 것을 나타냅니다 뿌리를 통해, 그것은이 경우 어느 쪽이든 의미가 없습니다.

옵션을 고려하십시오 :

이벤트를 루트로 만들면 고객 편견이 없을 수 있으며 고객을 검색, 편집 및 지속 할 수있는 유일한 방법은 이벤트를 통해 이벤트 일 것입니다. 그것은 나에게 매우 잘못된 것 같습니다.

고객을 루트로 만들면 이벤트 보고서가 없을 수 있으며 이벤트를 검색, 편집 및 유지할 수있는 유일한 방법은 특정 고객을 통해 이벤트입니다. 그것은 나에게도 잘못 들린다.

유일한 남은 가능성은 그것들이 별도의 뿌리라는 것입니다. 이것은 또한 서로 만 느슨하게 연결되어 있으며 고객이나 이벤트 고객을위한 이벤트를 찾기 위해 일종의 도메인 서비스가 필요하다는 것을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top