2012-03-13 55 views
1

如何模擬具有兩個簽名的方法?Rhino Mocks - 使用Expect.Call獲得兩個簽名的方法

須藤代碼:

public Class ClassA{ 
    //... do stuff 
} 

public Class ClassB{ 
    //... do stuff 
} 

public Class BigClass 
{ 
    public BigClass(){} 

    public ClassB MapMe(ClassA a) 
    { 
    //... do stuff 
    return new ClassB(); 
    } 

    public ClassA MapMe(ClassB a) 
    { 
    //... do stuff  
    return new ClassA(); 
    } 
} 

public Class ClassToTest 
{ 
    public void DoSomething() 
    { 
    var ResultA = BigClass.MapMe(new ClassA()); 

    //... do some more stuff 

    ResultA = BigClass.MapMe(new ClassB()); 
    } 
} 

道歉窮人代碼示例,iPad上這樣做,但希望給你的想法。

+4

爲什麼答案顯然是不只是「你嘲笑了一類具有一個簽名以同樣的方式」目前尚不清楚(或理想的接口,當然)。我建議你刪除這個問題,然後等待,直到你在一臺能夠真正寫出*好*問題的計算機上,並有一個恰當的例子,顯示你已經嘗試了什麼以及發生了什麼。 – 2012-03-13 20:53:53

+0

脾氣暴躁,我應該堅持LinkedIn開發者論壇,人們似乎能夠明白,在酒店房間裏,你可能只有你的記憶和iPad。 – 2012-03-14 08:34:19

+5

但是在那種情況下,你現在得到答案是非常緊急的嗎?您無論如何都無法測試或使用它 - 爲什麼不考慮試圖回答問題的人,並等待您有足夠的時間來正確地做到這一點?請閱讀http://tinyurl.com/so-hints – 2012-03-14 08:38:41

回答

7

只需使用Argument Constraints

參數約束也通過指定 參數類型定義方法的簽名。這就是爲什麼他們不能被忽略。

mock.Expect(x => x.MapMe(Arg<ClassB>.Is.Anything).Return(resultB); 
mock.Expect(x => x.MapMe(Arg<ClassA>.Is.Anything).Return(resultA); 

編輯:

我相信你面對的另一個問題 - 你嘲笑BigClass而沒有備份接口,這樣顯然RhinoMocks不允許設置這樣的模擬期望。所以,只是抽象的一個BigClass通過接口和模擬基於它:

public interface IMapper 
{ 
    ClassB MapMe(ClassA entity); 
    ClassA MapMe(ClassB entity); 
} 

public class BigClass : IMapper 


[Test] 
public void MapperTest() 
{ 
    // !!! Below I've used WhenCalled() to show you that correct 
    // expectation is called based on argument type, just see in debugger 
    IMapper mapperMock = MockRepository.GenerateMock<IMapper>(); 
    mapperMock.Expect(x => x.MapMe(Arg<ClassA>.Is.Anything)) 
       .WhenCalled((mi) => 
         { 
          Debug.WriteLine("MapMe - ClassA parameter"); 
         }) 
       .Return(null /*TODO: return correct instance*/); 
    mapperMock.Expect(x => x.MapMe(Arg<ClassB>.Is.Anything)) 
       .WhenCalled((mi) => 
         { 
          Debug.WriteLine("MapMe - ClassB parameter"); 
         }) 
       .Return(null /*TODO: return correct instance*/); 

    var resultB = mapperMock.MapMe(new ClassA()); 
    var resultA = mapperMock.MapMe(new ClassB()); 

    // TODO: Asserts 
} 
+0

非常感謝,應該說我嘗試過,失敗了,不記得剛纔的錯誤,但是當我在早上上班時會添加它。 – 2012-03-13 23:19:08

+0

也試了其他一些,也將在早上加這些,省去重複測試的方法。無法準確記錄錯誤的位置,但在replayAll中認爲它是wa。 – 2012-03-13 23:22:01

+0

我相信你嘲笑沒有支持界面的課堂,看到更新的答案。無論如何,請添加您使用的實際代碼,因爲它很難假設 – sll 2012-03-14 07:18:17