문제

객체에서 동등한 방법에 대한 테스트를 설정하는 데 문제가 있습니다.

해당 객체는이 인터페이스에 의해 정의됩니다.

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 인터페이스는 동일한 네임 스페이스의 일부이지만 테스트, 인터페이스 또는 구현 클래스의 곳은 참조됩니다. 나는 그것이 왜 방해되는지 이해하지 못한다. 내가 모을 수있는 한 그것에 대한 언급은 없습니다.

나는 -hino.mocks v3.5.0.1337 -nunit.framework v2.5.0.8332를 사용하고 있습니다

누구든지 아이디어가 있습니까?

도움이 되었습니까?

해결책

예, 이것은 복잡합니다 - 오류는 미쳤습니다. 이것은 iaircraft와 아무 관련이 없습니다. 본질적으로 문제는 그 것입니다 인터페이스는 클래스가 아니므로 객체에서 상속되지 않습니다.. 다시 말해 - Closeat에는 스터브 할 수있는 동등한 방법이 없습니다.

사실, 아마도 인터페이스에 캐스트 된 객체에서 명시 적으로 equals ()를 호출 할 수있는 약간의 언어 플럽 일 것입니다.

그러면 이것을 고치는 두 가지 방법

  1. 인터페이스를 조롱하지 말고 구현 mocks.stub () - 이것은 가상 인 동등한 메소드가 있으므로 코드가 작동합니다.
  2. 더 나은 것은 인터페이스에 평등 메소드를 추가하십시오. 일단 당신이 그렇게하면 당신은 그것을 무시할 수 있고 모든 클래스가 객체에서 상속되기 때문에 당신은 원치 않는 한, 당신이 원하지 않는 한, 그것을 구현할 필요는 없습니다.

다시 말해

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

언제 깨집니다

public interface IInterface {
}

그러나 언제 작동합니다

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

다른 팁

내가 뭔가를 놓치지 않는 한, 시간은 단순한 불변의 대상이어야합니다. 그래서 나는 단지 그것을 테스트 한 소규모 가치 클래스로 구현했습니다. 그런 다음 Real Equals 메소드를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top