我有一个相对简单的抽象类。我已经为这个问题进一步简化了。
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);
}
}
我正在试图弄清楚如何编写单元测试以确保对象等于覆盖工作。我尝试创建一个模拟,但是当我将模拟作为一个对象并调用Equals时,它不会在抽象类中调用我的代码。它只是立即返回false。如果我将它添加到对象列表并在列表中调用.Remove或.Contains,则相同;仍然只返回false,而不是在我的抽象类中使用代码。
我正在使用mstest和犀牛嘲笑。
为了完整性,这是一个我期望工作的测试,但不是:
[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));
}
答案 0 :(得分:1)
当然,我在发布问题之后就知道了......
我不知道这是否是正确的方法,但它似乎正在起作用。我告诉存根.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));
}