2012-03-17 42 views
4

我有一個相對簡單的抽象類。我爲這個問題進一步簡化了它。如何告訴我的抽象類的模擬/存根使用它的Object.Equals()覆蓋?

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和rhino mocks。

爲了完整起見,這裏是我希望的工作,但沒有一個試驗:

[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)); 
} 

回答

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)); 
} 
相關問題