سؤال

لدينا شرط لإضافة تذكير حدث عندما يدخل المستخدم عنوان بريده الإلكتروني في صفحة الحدث. الحدث هو كائن مجال آخر. كان فكرنا الأولي هو إنشاء كائن نطاق عملاء وعملاء العملاء ذي الصلة:

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

كيف يمكننا التحقق في اختبار الوحدة التي تم بالفعل استدعاء طريقة addemailreminder بالفعل العميل الجديد؟

افكاري:

  1. استخدم مصنع لإنشاء العميل. هذه الرائحة لأنني اعتقدت أنك من المفترض فقط استخدام المصنع حيث كان هناك بعض التعقيد في إنشاء الكائن.
  2. شفرة سيئة. ربما هناك طريقة أفضل للقيام بذلك؟
  3. موك السحر.

في مذكرة منفصلة (ربما تكون ذات صلة)، كيف نقرر أي جذر إجمالي هنا؟ لقد قررنا العميل بشكل تعسفي، ولكن يمكن أن يكون الحدث بنفس القدر. لقد قرأت وفهم المقالات عن الجذور الإجمالية، لكن من غير الواضح في هذا السيناريو.

هل كانت مفيدة؟

المحلول

في حالات مثل هذا، سأقوم بإنشاء طريقة محمية في الخدمة التي تنشئ العميل، في تجاوز الاختبار الطريقة التي تتمتع بها مع فئة داخلية مجهولة، وجعلها ترجع كائن عميل وهمية. ثم يمكنك التحقق من كائن عملاء وهمية تم استدعاء addemailreminder. شيء مثل:

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 Custinservice

هل هناك أي أسباب معينة لماذا قررت تثبيت هذه العملية في عملاء؟ هذا يبدو قليلا ويكيميم إلي. هل يمكن أن تكون مغلقة مباشرة على العميل بدلا من ذلك؟

ربما تركت شيء من مثال رمز CustomerService لتبسيط الأشياء ...

ومع ذلك، إذا كان يجب عليك تغيير التوقيع لأخذ مثيل العميل يحل المشكلة:

public void AddEventReminder(Customer customer, int eventId)

ولكن بعد ذلك مرة أخرى، يتأهل Int32 ككائن مجال، لذلك يجب أن يكون التوقيع حقا

public void AddEventReminder(Customer customer, Event event)

والسؤال هو الآن ما إذا كانت هذه الطريقة تضيف أي قيمة على الإطلاق؟

ما هو الجذر الإجمالي؟

لا أحد منهم، وأعتقد. يشير جذر إجمالي إلى إدارة الأطفال فقط من خلال الجذر، وهذا لن يكون منطقيا في كلتا الحالتين في هذه الحالة.

النظر في الخيارات:

إذا قمت بإجراء حدث الجذر، فهذا يعني أنه لا يمكن أن لا يكون لديك مخصصات مخصصة، والطريقة الوحيدة التي يمكنك استردادها وتعديلها وتستمر فيها عميل سيكون من خلال حدث. هذا يبدو خاطئا جدا بالنسبة لي.

إذا قمت بإجراء الجذر، فيمكنك عدم وجود EventRepository، والطريقة الوحيدة التي يمكنك استردادها وتعديلها وتستمر فيها حدثا من خلال عميل محدد. هذا يبدو خاطئا بالنسبة لي.

الاحتمال الوحيد المتبقي هو أنهم جذور منفصلة. هذا يعني أيضا أنهم متصلون بشكل فضفاض فقط ببعضهم البعض، وستحتاج إلى نوع من خدمة المجال للبحث عن الأحداث اللازمة للعملاء، أو العملاء لحدث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top