2010-04-19 41 views
1

我怎樣才能用參數來模擬一個無效方法並更改值參數?模擬一個改變輸入值的無效方法

我想測試一個類(SomeClassA),它對另一個類(SomeClassB)有依賴性。我想嘲笑SomeClassB。


public class SomeClassA 
{ 
    private SomeClassB objectB;  
    private bool GetValue(int x, object y) 
    { 
     objectB.GetValue(x, y);  // This function takes x and change the value of y 
    } 
} 

SomeClassB實現接口的IFoo


public interface IFoo 
{ 
    public void GetValue(int x, SomeObject y)  // This function takes x and change the value of y 
} 

pulic class SomeClassB : IFoo 
{ 
    // Table of SomeObjects 
    public void GetValue(int x, SomeObject y) 
    { 
     // Do some check on x 
     // If above is true get y from the table of SomeObjects 
    } 
} 

然後在我的單元測試類,我製備的委託類模仿SomeClassB.GetValue:


private delegate void GetValueDelegate(int x, SomeObject y); 
private void GetValue(int x, SomeObject y) 
{ // process x 
    // prepare a new SomeObject obj 
    SomeObject obj = new SomeObject(); 
    obj.field = x; 
    y = obj; 
} 

在我寫的模擬部分:


IFoo myFooObject = mocks.DynamicMock(); 
Expect.Call(delegate { myFooObject.Getvalue(5, null); }).Do(new GetValueDelegate(GetValue)).IgnoreArguments().Repeat.Any(); 

SomeObject o = new SomeObject(); 

myFooObject.getValue(5, o); 
Assert.AreEqual(5, o.field); // This assert fails! 

我檢查了幾個帖子,委託似乎是嘲笑無效方法的關鍵。 但是,嘗試上述後,它不起作用。你能否建議我的代表班有什麼問題?或在模擬陳述中出現錯誤?


我RhinoMocks是3.5,好像它丟棄做兼職,如果我有IgnoreArguments() 我剛剛找到了這個網頁: http://www.mail-archive.com/[email protected]/msg00287.html

現在我已經改變了

Expect.Call(委託{myFooObject.Getvalue(5,null);})。 Do(new GetValueDelegate(GetValue))。IgnoreArguments() .Repeat.Any();

Expect.Call(委託{myFooObject.Getvalue(5,NULL);})。IgnoreArguments()。 Do(new GetValueDelegate(GetValue)) .Repeat.Any();

現在它工作得很好!

+0

我不太清楚你的問題。你可以發佈你想要測試的方法取決於IFoo嗎? – 2010-04-19 11:40:54

+1

嗨,爲了使您的GetValue工作,您需要將參數標記爲ref。你能發佈真正有用的方法嗎? – Grzenio 2010-04-19 13:15:10

+0

嗨Darin和Grzenio,我剛剛編輯上面進一步闡述了這個問題。提前致謝! – Kar 2010-04-20 01:56:41

回答

4

Kar,你使用的是一個真正舊版本的.NET或什麼?這種語法已經過時了很長一段時間。我也認爲你做錯了。犀牛嘲諷不是魔術 - 它不會做任何你使用一些額外的代碼行不能做的事情。

例如,如果我有

public interface IMakeOrders { 
    bool PlaceOrderFor(Customer c); 
} 

我可以實現它:

public class TestOrderMaker : IMakeOrders { 
    public bool PlaceOrderFor(Customer c) { 
    c.NumberOfOrders = c.NumberOfOrder + 1; 
    return true; 
    } 
} 

var orders = MockRepository.GenerateStub<IMakeOrders>(); 
orders.Stub(x=>x.PlaceOrderFor(Arg<Customer>.Is.Anything)).Do(new Func<Customer, bool> c=> { 
    c.NumberOfOrders = c.NumberOfOrder + 1; 
    return true; 
}); 

this intro to RM,我寫了一些承包商。

+0

謝謝喬治!是的,我仍然使用.net 2.0(所以現在我們希望將它升級到3.5 ...但這將需要一段時間...)你的代碼看起來非常乾淨整潔。感謝您的介紹,這真的很有幫助。 :) – Kar 2010-05-05 01:55:57