Rhinomocks는 방법을 포함시킬 때 예외입니다
-
05-07-2019 - |
문제
객체에서 동등한 방법에 대한 테스트를 설정하는 데 문제가 있습니다.
해당 객체는이 인터페이스에 의해 정의됩니다.
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 ()를 호출 할 수있는 약간의 언어 플럽 일 것입니다.
그러면 이것을 고치는 두 가지 방법
- 인터페이스를 조롱하지 말고 구현 mocks.stub () - 이것은 가상 인 동등한 메소드가 있으므로 코드가 작동합니다.
- 더 나은 것은 인터페이스에 평등 메소드를 추가하십시오. 일단 당신이 그렇게하면 당신은 그것을 무시할 수 있고 모든 클래스가 객체에서 상속되기 때문에 당신은 원치 않는 한, 당신이 원하지 않는 한, 그것을 구현할 필요는 없습니다.
다시 말해
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 메소드를 사용할 수 있습니다.