RhinoMocks استثناءات عندما الإستئصال من يساوي طريقة

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

سؤال

لدي مشكلة إعداد اختبار يساوي الأسلوب على كائن.

الكائن في السؤال هو تعريف هذه الواجهة:

public interface IHours {
    ITimeOfDay OpenAt { get; set; }
    ITimeOfDay CloseAt { get; set; }
    DateTime ValidFrom { get; set; }
    DateTime ValidTo { get; set; }
    bool isCovered(DateTime time);
}

وأنه يحتوي على مراجع إلى ITimeOfDay محددة مثل:

public interface ITimeOfDay {
    DateTime Time { get; set; }
    int Hour { get; }
    int Minute { get; }
    int Second { get; }
}

الآن أريد يساوي من ساعة :IHours للتحقق من OpenAt و CloseAt IHours.لوضع هذا الأمر وأنا أحاول أن كعب هذه المنشأة قيم و فقط return true و false اعتمادا على ما بلدي خاصة اختبار تحتاج لها أن تكون.

    [SetUp]
    public virtual void SetUp() {
        mocks = new MockRepository();

        defaultHours = getHours();
        otherHours = getHours();

    }

    [TearDown]
    public virtual void TearDown() {
        mocks.ReplayAll();
        mocks.VerifyAll();
    }

    [Test(Description = "Equals on two Hours should regard the fields")]
    public void Equals_TwoValueEqualledObjects_Equal() {
        var openAt = mocks.Stub<ITimeOfDay>();
        var closeAt = mocks.Stub<ITimeOfDay>();

        closeAt                                   //this is line 66, referenced in the error stacktrace
            .Stub(o => o.Equals(null))
            .IgnoreArguments()
            .Return(true);

        openAt
            .Stub(c => c.Equals(null))
            .IgnoreArguments()
            .Return(true);
        mocks.ReplayAll();

        defaultHours.OpenAt = openAt;
        otherHours.OpenAt = openAt;

        defaultHours.CloseAt = closeAt;
        defaultHours.CloseAt = closeAt;

        Assert.That(defaultHours, Is.EqualTo(otherHours));
        Assert.That(defaultHours.GetHashCode(), Is.EqualTo(otherHours.GetHashCode()));
    }

ولكن يمكنني الحصول على هذا خفي خطأ عند تشغيل الأمر:

System.InvalidOperationException: Type 'System.Boolean' doesn't match the return type   'System.Collections.Generic.IList`1[NOIS.Model.Interfaces.IAircraft]' for method 'IAircraftType.get_Aircrafts();'
at Rhino.Mocks.Expectations.AbstractExpectation.AssertTypesMatches(Object value)
at Rhino.Mocks.Expectations.AbstractExpectation.set_ReturnValue(Object value)
at Rhino.Mocks.Impl.MethodOptions`1.Return(T objToReturn)
at Nois.Test.Model.Entities.HoursTest.Equals_TwoValueEqualledObjects_Equal() in HoursTest.cs: line 66 

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

أنا باستخدام - وحيد القرن.يسخر v3.5.0.1337 - NUnit.إطار v2.5.0.8332

أي شخص لديه أي فكرة ؟

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

المحلول

نعم هذا هو معقد - الخطأ هو مجنون هذا لا علاقة له مع IAircraft.أساسا هذه المسألة هو أن واجهة ليست فئة وبالتالي لا يرث من وجوه.وبعبارة أخرى - closeAt لا يساوي طريقة للاصطدام.

كما واقع الأمر ، ربما قليلا من اللغة فلوب أن يمكنك حتى الدعوة يساوي() صراحة على كائن يلقي إلى واجهة.

طريقتان لإصلاح هذا ثم

  1. لا تسخر واجهة صورية تنفيذ يسخر.كعب() - وهذا لا يكون لها يساوي الطريقة الافتراضية بحيث قانون العمل.
  2. حتى أفضل ، إضافة يساوي طريقة واجهة الخاص بك.مرة كنت تفعل ذلك سوف تكون قادرة على تجاوز ذلك لأن جميع الطبقات ترث من وجوه أنك لن تضطر إلى تنفيذ ذلك explcitly من أي وقت مضى (إلا إذا كنت تريد).

وبعبارة أخرى

var intrface = MockRepository.GenerateStub<IInterface>();
intrface.Stub(x => x.Equals(null)).IgnoreArguments().Return(true); 

فواصل عندما

public interface IInterface {
}

ولكن عندما يعمل

public interface IInterface {
  bool Equals(object obj);
}

نصائح أخرى

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

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