質問

オブジェクトのEqualsメソッドのテストの設定に問題があります。

問題のオブジェクトは、このインターフェースによって定義されています:

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をチェックさせたい」。これを設定するには、これらのプロパティ値をスタブし、特定のテストで必要な値に応じて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インターフェイスは同じ名前空間の一部ですが、テスト、インターフェイス、または実装クラスのどこでも参照されていません。なぜ干渉するのか分かりません。収集できる限り、それに関する言及はありません。

使用しています -Rhino.Mocks v3.5.0.1337 -NUnit.Framework v2.5.0.8332

誰もが考えていますか?

役に立ちましたか?

解決

ええ、これは複雑です-エラーはおかしいです、これはIAircraftとは何の関係もありません。基本的に問題は、インターフェースはクラスではないため、オブジェクトから継承しないということです。つまり、closeAtにはスタブアウトするEqualsメソッドがありません。

実際のところ、インターフェイスにキャストされたオブジェクト上でEquals()を明示的に呼び出すこともできる、おそらく言語のフラブです。

これを修正する2つの方法

  1. インターフェースをモックせず、実装をモックしますmocks.Stub()-これは仮想のequalsメソッドを持っているため、コードが機能します。
  2. さらに良いのは、インターフェースにEqualsメソッドを追加することです。これを行うと、オーバーライドできるようになります。すべてのクラスはオブジェクトを継承するため、(必要でない限り)明示的に実装する必要はありません。

言い換えれば

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

次の場合に破損

public interface IInterface {
}

ただし、動作するのは

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

他のヒント

何かが足りない場合を除き、Time of Dayは単純な不変オブジェクトでなければなりません。したがって、テスト済みの小さな値クラスとして実装するだけです。その後、実際のEqualsメソッドを使用できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top