Testing Rhinomock在剔除Equals方法时会处理异常
我在为对象上的Equals方法设置测试时遇到问题 有问题的对象由此接口定义:Testing Rhinomock在剔除Equals方法时会处理异常,testing,tdd,rhino-mocks,stubbing,Testing,Tdd,Rhino Mocks,Stubbing,我在为对象上的Equals方法设置测试时遇到问题 有问题的对象由此接口定义: public interface IHours { ITimeOfDay OpenAt { get; set; } ITimeOfDay CloseAt { get; set; } DateTime ValidFrom { get; set; } DateTime ValidTo { get; set; } bool isCovered(DateTime time); } 并包
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; }
}
现在我想用小时数的相等值:I小时来检查打开和关闭I小时。为了进行设置,我尝试将这些属性值剔除,并根据我的特定测试需要返回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()));
}
IAircraftType接口是同一命名空间的一部分,但在测试、接口或实现类中没有引用它。我不明白它为什么会干扰。据我所知,没有提及此事
我正在使用
-Rhino.Mocks v3.5.0.1337
-NUnit.frameworkV2.5.0.8332
有人知道吗?是的,这很复杂-错误很疯狂,这与飞机无关。本质上,问题在于接口不是类,因此不从对象继承。换句话说,closeAt没有一个Equals方法可以删除 事实上,这可能有点语言混乱,您甚至可以对转换到接口的对象显式调用Equals() 有两种方法可以解决这个问题
var intrface = MockRepository.GenerateStub<IInterface>();
intrface.Stub(x => x.Equals(null)).IgnoreArguments().Return(true);
但当
public interface IInterface {
bool Equals(object obj);
}
除非我遗漏了什么,否则一天中的时间应该是一个简单的不可变对象。所以我将它实现为一个小的、经过测试的值类。然后您可以使用real Equals方法。这是一个相当复杂的测试-您是否可以提供完整的代码?我将仔细研究一下,看看是否可以复制您的错误,但如果没有sourceNevermind,这将很困难,请看我的答案-这实际上是一个非常有趣的案例。对不起,我无法提供所有内容的完整来源。我会尽量挑选出所需要的,并把它放在一个单独的项目。如果它仍然产生奇怪的异常,我会发布它。我将此推特发送给Ayende,希望他能加入carzy错误的行列,这在这个特殊情况下是正确的。我确实这样做了一段时间,但我强烈的好奇心不允许我就此罢休。为此,我现在很高兴,因为乔治的回答使一个糟糕的星期五好了许多倍。
public interface IInterface {
}
public interface IInterface {
bool Equals(object obj);
}