مكالمة غير صالحة، تم استخدام المكالمة الأخيرة أو لم يتم إجراء مكالمة

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

سؤال

أحصل على هذا الخطأ عندما أحاول ضبط وهمية PropertyBehavior():

system.invalidoperationException: system.invalidoperationException: استدعاء غير صالح، تم استخدام المكالمة الأخيرة أو لم يتم إجراء مكالمة (تأكد من الاتصال بطريقة افتراضية (C #) / المعقول (VB)) ..

أحاول استخدام فقط أكرينو السخرط 3.5. (ترتيب، ACT، تأكيد)

هنا هو رمزي:

    private IAddAddressForm form;

    private AddAddressMediator mediator;

    [TestInitialize()]
    public void MyTestInitialize()
    {
        form = MockRepository.GenerateMock<IAddAddressForm>();
        mediator = new AddAddressMediator(form);


        // Make the properties work like a normal property
        Expect.Call(form.OKButtonEnabled).PropertyBehavior();

        //I tried this too.  I still get the exception
        //SetupResult.For(form.OKButtonEnabled).PropertyBehavior();
    }


    [TestMethod]
    public void TestOKButtonEnabled()
    {

        form.OKButtonEnabled = true;
        Assert.IsTrue(form.OKButtonEnabled);
    }

أعلم أنني أستطيع استخدام كعب (وعلى الكود أعلاه) ولكني أحاول تعلم أسخر القرن الكركدي.

في النهاية أريد أن أكون قادرا على التأكد من أن العديد من العقارات لديها قيمها التي يتم الوصول إليها. (أي تلميحات حول كيفية التحقق من ذلك form.FirstName تم الوصول إلى (أي استدعاء Getter) أيضا موضع تقدير.)

في حالة حاجة، إليك التعليمات البرمجية IAddressForm:

namespace AddressBook
{
    public interface IAddAddressForm
    {
        string FirstName { get; set; }
        string LastName { get; set; }
        string Address1 { get; set; }
        string State { get; set; }
        string Address2 { get; set; }
        string ZipCode { get; set; }
        string City { get; set; }
        bool OKButtonEnabled { get; set; }
    }
}

على أي حال، اعتقدت أن الافتراضية لن تكون مشكلة كما أتخلص في واجهة، لكنني أفتقد بوضوح شيئا ما.

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

المحلول

لم تستخدم قط PropertyBehavior من قبل، ولكن هل هذا هو بناء الجملة الذي تبحث عنه؟

form.Stub(x=>x.OKButtonEnabled).PropertyBehavior()

يعمل أكشن الأسماك بالكامل من خلال طرق الإرشاد الآن. الدعوة الساكنة الوحيدة التي أجدها أكثر من ذلك MockRepository.GenerateStub.

نصائح أخرى

لقد ذكرت باستخدام كعب كعب بدلا من حصة، ولكن قبل أن تذهب إلى تغييره، لاحظ أنه من الغريب، أحصل على استثناء المكالمات غير غير صالح عندما استخدمت Generestub ولكن ليس عند استخدام GodeMock.

View = MockRepository.GenerateStub<IAddressView>();
View.Stub(v => v.Message).PropertyBehavior();

هذا يلقي استثناء المكالمات غير الصالحة ونعم، IADDRESSVIEW.MESSAGE يحتوي على getter و sedter.

تلقيت هذا الخطأ عندما حاولت تعيين توقع في طريقة غير ظاهرية.

mockedObject.Expect(a => a.NonVirtualMethod()).Returns(null);

ذهب الخطأ بعيدا عندما أدلت بشكل افتراضي Nonvirtualmethod.

أعتقد أنك يجب أن تقوم بعمل Mockrepository.replyall () بعد إعداد جميع التوقعات وقبل البدء في استخدام هذا النطاق. لذا فإن تخمين في قضيتك هو أنه يتعين عليك تحريك خط التوقع. Call Center قبل الوسيط = Addaddressmediator (نموذج)؛، وعصي الرد على ما يرام بعد ذلك:

[TestInitialize()]
public void MyTestInitialize()
{
    form = MockRepository.GenerateMock<IAddAddressForm>();
    // Make the properties work like a normal property
    Expect.Call(form.OKButtonEnabled).PropertyBehavior();

    //I tried this too.  I still get the exception
    //SetupResult.For(form.OKButtonEnabled).PropertyBehavior();

    MockRepository.ReplyAll();
    mediator = new AddAddressMediator(form);



}

ركضت في هذه المشكلة عندما كنت أحاول الاتصال internal الممتلكات (Getter فقط) على كائن في C #. في هذه الحالة، مضيفا .PropertyBehavior() لم يساعد.

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

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