2016-10-28 79 views
1

所以我使用Simple.Mocking來模擬我的測試中的一些接口。有些方法接收自定義對象Simple.Mocking使用自定義對象調用期望方法

public class MyObj 
{ 
    public int Attr { get; set; } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as MyObj); 
    } 

    public override int GetHashCode() 
    { 
     return Attr; 
    } 

    private bool Equals(MyObj myObj) 
    { 
     return Attr == myObj.Attr; 
    } 
} 

public interface IFoo 
{ 
    void Show(MyObj o); 
} 

public class ObjUnderTest 
{ 
    public ObjUnderTest(IFoo foo) 
    { 
     var o = new MyObj{ Attr = 1; }; 
     foo.Show(o); 
    } 
} 

[TestClass] 
public class TestClasse 
{ 
    [TestMethod] 
    public void TestShow() 
    { 
     var foo = Mock.Interface<IFoo>(); 
     var myObj = new MyObj { Attr = 1 }; 
     Expect.Once.MethodCall(() => foo.Show(myObj)); 

     var objectUnderTest = new ObjUnderTest(foo); 

     AssertExpectations.IsMetFor(foo); 
    } 
} 

的問題是,測試總是失敗,即使Show被稱爲與Attr一個對象等於1。只有當我寫的期待像這樣通過:

Expect.Once.MethodCall(()=> foo.Show(Any<MyObj>.Value)); 

這不是我所需要的。我知道它失敗,因爲那些是不同的對象,但我已經嘗試覆蓋MyObjEqualsGetHashCode沒有成功。 任何想法?

+0

提供一個問題[MCVE] 。當前的例子不完整。 – Nkosi

+0

@Nkosi完成! – fivunlm

回答

1

如果所需結果是驗證輸入,你可以嘗試指定與謂語

Expect.Once.MethodCall(()=> foo.Show(Any<MyObj>.Value.Matching(obj => obj.Attr == 1))); 

來源exptectation:在Github上項目的自述 - Using "wildcard" parameter values

[TestClass] 
public class TestClasse { 
    [TestMethod] 
    public void TestShow() { 
     //Arrange 
     var foo = Mock.Interface<IFoo>(); 
     Expect.Once.MethodCall(()=> foo.Show(Any<MyObj>.Value.Matching(obj => obj.Attr == 1))); 
     //Act 
     var objectUnderTest = new ObjUnderTest(foo); 
     //Assert 
     AssertExpectations.IsMetFor(foo); 
    } 
} 
+0

我實際上有超過一個屬性來檢查平等,但你的解決方案的作品。謝謝! – fivunlm

+0

很高興幫助。是的,這個答案僅僅是一個基於原始問題而建立起來的例子。快樂編碼! – Nkosi