如何告诉抽象类的mock/stub使用它对Object.Equals()的重写

本文关键字:Object Equals 重写 抽象类 何告诉 mock stub | 更新日期: 2023-09-27 18:28:01

我有一个相对简单的抽象类。为了这个问题,我进一步简化了它。

public abstract class BaseFoo
{
    public abstract string Identification { get; }
    //some other abstract methods
    public override bool Equals(object obj)
    {
        BaseFoo other = obj as BaseFoo;
        if(other == null)
        {
            return false;
        }
        return this.Identification.Equals(other.Identification);
    }
}

我正试图弄清楚如何编写一个单元测试,以确保objectequals覆盖有效。我尝试创建一个mock,但当我将mock转换为对象并调用Equals时,它不会调用抽象类中的代码。它只是立即返回false。如果我将其添加到对象列表中并在列表中调用.Remove或.Contains,也是如此;仍然只是返回false,而没有命中我的抽象类中的代码。

我用的是mstest和rhino模拟。

为了完整性,这里有一个我希望能工作但没有工作的测试:

[TestMethod]
public void BaseFoo_object_Equals_returns_true_for_Foos_with_same_Identification()
{
    var id = "testId";
    var foo1 = MockRepository.GenerateStub<BaseFoo>();
    var foo2 = MockRepository.GenerateStub<BaseFoo>();
    foo1.Stub(x => x.Identification).Return(id);
    foo2.Stub(x => x.Identification).Return(id);
    Assert.IsTrue(((object)foo1).Equals(foo2));
}

如何告诉抽象类的mock/stub使用它对Object.Equals()的重写

当然,我在发布问题后就发现了。。。

我不知道这是否是正确的方法,但它似乎奏效了。我告诉了存根。CallOriginalMethod()

[TestMethod]
public void BaseFoo_object_Equals_returns_true_for_Foos_with_same_Identification()
{
    var id = "testId";
    var foo1 = MockRepository.GenerateStub<BaseFoo>();
    var foo2 = MockRepository.GenerateStub<BaseFoo>();
    foo1.Stub(x => x.Identification).Return(id);
    foo2.Stub(x => x.Identification).Return(id);
    foo1.Stub(x => ((object)x).Equals(Arg<object>.Is.Anything)).CallOriginalMethod(OriginalCallOptions.NoExpectation);
    Assert.IsTrue(((object)foo1).Equals(foo2));
}