سؤال

أنا أحاول العثور على طريقة وهمية نتيجة طريقة تسمى من خلال أسلوب آخر.

لدي "LoadData" الأسلوب الذي يدعو منفصل مساعد للحصول على بعض البيانات ثم تحويل ذلك (أنا مهتم في اختبار تحويل النتيجة).

لذلك يجب رمز مثل هذا:

public class MyClass(){
  public void LoadData(){
    SomeProperty = Helper.GetSomeData();
 }
 public object SomeProperty {get;set;}
}

أريد أن يكون نتيجة معروفة من المساعد.GetSomeData الأسلوب ().هل يمكنني استخدام ساخرا إطار (لدي محدودة إلى حد ما تجربة مع وحيد القرن يسخر ولكن أنا مفتوحة إلى أي شيء) إلى القوة المتوقعة النتيجة ؟ إذا كان الأمر كذلك ، كيف ؟

*تحرير نعم كما هو متوقع لم أتمكن من تحقيق الاختراق أردت ، يجب أن تعمل أفضل طريقة لإعداد البيانات.

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

المحلول

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

بدلا من ذلك, يمكنك إضافة الزائد عن LoadData أن يقبل كما المعلمات البيانات التي عادة استرداد من كائن مساعد.هذا قد يكون أسهل.

نصائح أخرى

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

سيكون لديك للقيام ببعض إعادة بيع ديون أن تكون قادرة على ضخ نموذج كائن مع دمية GetSomeData الأسلوب ().

في هذه النسخة المبسطة من التعليمات البرمجية الخاصة بك من الصعب أن أعطيك إجابة مباشرة.لديك بعض الخيارات:

  • إنشاء واجهة مساعد من الدرجة وتوفير وسيلة العميل لحقن مساعد التنفيذ class MyClass.ولكن إذا كان المساعد هو فقط حقا فئة فائدة لا معنى كبير.
  • إنشاء محمية الأسلوب في MyClass يسمى getSomeData وجعلها فقط اتصل مساعد.LoadSomeData.ثم استبدال استدعاء إلى مساعد.LoadSomeData في LoadData مع getSomeData.الآن يمكنك أن تسخر من getSomeData طريقة لإرجاع قيمة وهمية.

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

أنصح تحويل ما لديك في شيء مثل هذا:

public class MyClass()
{
    private IHelper _helper;

    public MyClass()
    {
        //Default constructor normal code would use.
        this._helper = new Helper();
    }

    public MyClass(IHelper helper)
    {
        if(helper == null)
        {
            throw new NullException(); //I forget the exact name but you get my drift ;)
        }
        this._helper = helper;
    }

    public void LoadData()
    {
        SomeProperty = this._helper.GetSomeData();
    }
    public object SomeProperty {get;set;}
}

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

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

إذا كان في بعض نقطة كنت تريد أن تأخذ خطوة أخرى في هذا المجال هل يمكن إزالة الافتراضي مساعد التنفيذ من المعدل الدرجة واستخدام الأولمبية الدولية (انعكاس السيطرة) حاويات.إذا thiis هو جديد لك على الرغم من أنني أنصح التركيز أولا على أساسيات لماذا كل هذا الازعاج إضافية يستحق في حين (فمن IMHO).

وحدة الاختبارات سوف ننظر بشيء من هذا القبيل الزائف كود:

public Amazing_Mocking_Test()
{
    //Mock object setup
    MockObject mockery = new MockObject();
    IHelper myMock = (IHelper)mockery.createMockObject<IHelper>();
    mockery.On(myMock).Expect("GetSomeData").WithNoArguments().Return(Anything);

    //The actual test
    MyClass testClass = new MyClass(myMock);
    testClass.LoadData();

    //Ensure the mock had all of it's expectations met.
    mockery.VerifyExpectations();
}

لا تتردد في التعليق إذا كان لديك أي أسئلة.(بالمناسبة ليس لدي أي فكرة إذا كان هذا الرمز جميع الأعمال لقد كتبتها في المتصفح الخاص بي, أنا أساسا توضح المفاهيم).

قد ترغب في النظر في Typemock المعزل ، والتي يمكن أن "وهمية" طريقة المكالمات دون يجبرك على ريفاكتور التعليمات البرمجية الخاصة بك.أنا ديف في هذه الشركة ، ولكن الحل هو البقاء إذا كنت تريد أن تختار عدم تغيير التصميم الخاص بك (أو أجبروا على عدم تغييره الاختبار) انها في www.Typemock.com

روي بلوق:ISerializable.com

نعم ساخرا الإطار هو بالضبط ما كنت أبحث عنه.يمكنك تسجيل / ترتيب كيف تريد بعض سخر بها / فافات الطبقات العودة.

وحيد القرن يسخر, Typemock ، موك كلها خيارات جيدة للقيام بذلك.

ستيفن فالتر بعد على استخدام وحيد القرن يسخر ساعدني كثيرا عندما بدأت اللعب مع وحيد القرن يسخر.

وأود أن محاولة شيء من هذا القبيل:

public class MyClass(){
  public void LoadData(IHelper helper){
    SomeProperty = helper.GetSomeData();
 }

بهذه الطريقة يمكنك وهمية تصل المساعد الطبقة باستخدام على سبيل المثال موك.

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