لماذا جزئية تسخر لها كل طرق افتراضية سخر ، حتى لو لم التوقعات ؟

StackOverflow https://stackoverflow.com/questions/806073

سؤال

لدي المستخدم من التحكم الذي لا التحقق من صحة بعض في ValidateChildren الطريقة التي أود أن الاختبار.لقد خلق جزئي وهمية التحكم المستخدم ولكن على الرغم من أنني لست وضع أي توقعات على ValidateChildren الأسلوب, أنا ببساطة الاتصال ، هو ببساطة تخطي التعليمات البرمجية داخل الأسلوب لم ينفذ.في محاولة فهم ما يجري أنا خلقت اختبار بسيط مثل:

public class Foo
{        
    public virtual bool Method1()
    {
        throw new NotImplementedException();
    }

    public virtual bool Method2()
    {
        return Method1();
    }
}

و استخدام هذا الاختبار:

[Test]
public void TestFooMethods ()
{
    MockRepository m = new MockRepository();
    Foo foo = m.PartialMock<Foo>();

    RhinoMocksExtensions.Expect<Foo,bool>(
                             foo, 
                             delegate (Foo obj)
                             {
                                 return obj.Method1();
                             }
                         ).Return(true);

    Assert.IsTrue (foo.Method2());
}

الآن أتوقع فو.Method1 أن سخر فو.Method2 لا يكون.ولكن هذا يعود دائما كاذبة و لو أنني حاولت من خلال الخطوة في المصحح فو.Method2() وصعدت فوق ولا أستطيع خطوة في ذلك.

أي أفكار لماذا ؟

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

المحلول 2

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

ويبدو أنني بحاجة إلى الاتصال على:

RhinoMocksExtensions.Replay (foo);

وقبل أن استدعاء

Assert.IsTrue (foo.Method2 ());
احتياجات

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

وعلى أي حال يبدو أن كل شيء يعمل، وأيام سعيدة جدا.

نصائح أخرى

إذا كنت تسخر كائن ستتجاوز كل مجردة/طرق افتراضية بغض النظر عن نوع من السخرية.ما يمكنك القيام به على الرغم من جعل توقع على طريقة وأخبره أن تنفيذ الأسلوب الأصلي هو الغالب باستخدام:

CallOriginalMethod(OriginalCallOptions.CreateExpectation);

كنت لا تستخدم وحيد القرن يسخر من الطريقة التي تم تصميم والتي يمكن أيضا أن تسبب لك المتاعب.يجب إعادة كتابة الاختبار الخاصة بك في الطريقة التي ينبغي أن تكون مكتوبة باستخدام C# 3.0 و امدا و طرق الإرشاد:

[TestMethod]
public void TestFooMethods()
{
    //Generate a new Mock to test against
    Foo foo = MockRepository.GenerateMock<Foo>();

    //Expect a call to Method1 on object foo and return true
    foo.Expect(f => f.Method1()).Return(true);
    //Expect a call to Method2 on object foo and call the original method
    foo.Expect(f => f.Method2()).CallOriginalMethod(OriginalCallOptions.CreateExpectation);

    Assert.IsTrue(foo.Method2());

    //Verify all our expectations on foo
    foo.VerifyAllExpectations();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top