Question

J'ai eu un problème pour configurer un test pour une méthode Equals sur un objet.

L'objet en question est défini par cette interface:

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

et il contient des références à ITimeOfDay telles que:

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

Maintenant, je veux que Equals of the Hours: IHours vérifie les OpenAt et CloseAt IHours. Pour le configurer, j'essaie de remplacer ces valeurs de propriété par des valeurs vraies et fausses, en fonction de la nature de mon test.

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

Mais je reçois cette erreur cryptique quand je l'exécute:

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 

L’interface IAircraftType fait partie du même espace de nom, mais n’est référencée nulle part dans le test, l’interface ou la classe d’implémentation. Je ne comprends pas pourquoi cela interfère. Il n'y a aucune référence à cela, autant que je sache.

j'utilise - Rhino.Mocks v3.5.0.1337 - NUnit.Framework v2.5.0.8332

Quelqu'un a une idée?

Était-ce utile?

La solution

Oui, c’est compliqué, l’erreur est folle, cela n’a rien à voir avec IAircraft. Le problème est essentiellement que une interface n'est pas une classe et n'hérite donc pas d'un objet . En d'autres termes, closeAt ne dispose pas d'une méthode Equals pour se déconnecter.

En fait, il est probable que vous puissiez même appeler Equals () explicitement sur un transtypage d'objet vers une interface.

Deux façons de résoudre ce problème, puis

  1. Ne vous moquez pas de l'interface, de la maquette d'implémentation .Stub () - cela a une méthode equals qui est virtuelle pour que votre code fonctionne.
  2. Encore mieux, ajoutez une méthode Equals à votre interface. Une fois que vous aurez fait cela, vous pourrez le redéfinir et puisque toutes les classes héritent d’un objet, vous n’aurez plus à l’implémenter (sauf si vous le souhaitez).

En d'autres termes

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

Se brise quand

public interface IInterface {
}

mais fonctionne quand

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

Autres conseils

À moins que je ne manque quelque chose, Time of Day devrait être un simple objet immuable. Je voulais donc simplement l'implémenter comme une petite classe de valeur testée. Ensuite, vous pouvez utiliser la vraie méthode Equals.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top