Frage

Ich habe ein Problem, einen Test für einen Equals Methode für ein Objekt einrichten.

Das betreffende Objekt wird durch diese Schnittstelle definiert:

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

und enthält Verweise auf ITimeOfDay definiert so:

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

Jetzt möchte ich die Equals der Stunden: IHours die openat und CloseAt IHours zu überprüfen. Um dies einzurichten ich versuche, diese Eigenschaft-Werte aus, um Stummel und nur zurückgeben wahr und falsch je nachdem, was mein spezieller Test muss sie sein.

    [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()));
    }

Aber ich bekomme diese kryptische Fehlermeldung, wenn ich es laufen:

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 

Die IAircraftType-Schnittstelle ist ein Teil des gleichen Namensraumes, aber nirgends in der Test-Schnittstelle oder Klasse Implementierung ist es referenziert. Ich verstehe nicht, warum es stört. Es gibt keinen Hinweis darauf, wie weit ich sammeln kann.

Ich bin mit - Rhino.Mocks v3.5.0.1337 - NUnit.Framework v2.5.0.8332

Wer noch keine Idee?

War es hilfreich?

Lösung

Ja das ist kompliziert - der Fehler ist verrückt, das nichts mit IAircraft zu tun hat. Im Wesentlichen das Problem ist, dass eine Schnittstelle ist keine Klasse und daher nicht von dem Objekt erbt . Mit anderen Worten - closeAt nicht über eine Methode Equals auf Stub

.

Wie in der Tat, es ist wahrscheinlich ein bisschen eine Sprache flub, die Sie selbst Equals () explizit auf ein Objekt gegossen auf eine Schnittstelle aufrufen können.

Zwei Möglichkeiten, dieses Problem zu beheben, dann

  1. Sie die Schnittstelle nicht verhöhnen, verspotten die Umsetzung mocks.Stub () - dies hat eine Methode entspricht, die so virtuell ist Ihr Code funktioniert
  2. .
  3. Noch besser, fügen Sie eine Methode, um Ihre Schnittstelle entspricht. Sobald Sie das tun Sie es außer Kraft zu setzen in der Lage, und da alle Klassen von Objekt erben werden Sie es nicht umsetzen müssen explcitly je (es sei denn, Sie wollen).

Mit anderen Worten:

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

Breaks, wenn

public interface IInterface {
}

aber funktioniert, wenn

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

Andere Tipps

Es sei denn, ich etwas fehle, Tageszeit sollte ein einfaches unveränderliches Objekt sein. Also würde ich setze es nur als kleine, getestet Wertklasse. Dann können Sie die reale Equals-Methode verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top