Testing Rhinomock在剔除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); } 并包

我在为对象上的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; }
}
现在我想用小时数的相等值: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()

有两种方法可以解决这个问题

  • 不要模拟接口,模拟实现mocks.Stub()-这确实有一个虚拟的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);
    }