2012-05-18 70 views
2

一直試圖使用moq進行單元測試。Moq - 強類型類的設置返回值

這是一個類結構。

public interface IParameter<T> : IList<T> 
{ 
} 

public interface IParameters 
{ 
    IParameter<string> Types; 
} 

public class MyClass 
{ 
    public DataTable GetResult(IParameters parameters) 
    { 
     //do work here 
     return dt; 
    } 
} 

class TestMyClass 
{ 
    [Test] 
    public void TestGetResult() 
    { 
     var _mock = new Mock<IParameters>(); 
     _mock.SetUp(x => x.Types).Return(new [] {"1", "2"}); //Issue 
     var m = new MyClass() 
     var result = m.GetResult(_mock.Object) 
     Assert.IsNotNull(result); 
    } 
} 

我需要學習如何正確地調用_mock.SetUp所以在i參數屬性返回一個IList類型。

或者,我也試過這個...

var mock = new Mock<IParameters>(); 
var mockparams = new Mock<IParameter<string>>(); 
mockparams.SetReturnsDefault(); //What should i call to add { "1", "2", "3" } 
mock.Setup(x => x.ReportTypes).Returns(mockparams.Object); 

所以在mockparams我應該打電話約定的返回值有什麼功能?

+0

返回一個列表類型,而不是數組。新列表 {「1」,「2」} –

+0

這只是一個僞代碼,假設。但它應該返回類型IParameter ,而不僅僅是列表 Juvil

+0

你在'GetResult'方法中對'IParameters'做了什麼? – nemesv

回答

6

BTW:是IParameters.Types屬性或方法?

你可以只創建一個存根爲IParameter參數,因爲你propably不會想設置的IList的每個方法:

class ParameterStub : List<String>, IParameter<String> { } 

然後,嘲諷IParameters會是如此簡單:

... 
var mock = new Mock<IParameters>(); 
mock.Setup(x => x.Types).Returns(new ParameterStub() {"1","2"}); 
var m = new MyClass(); 
var result = m.GetResult(mock.Object); 
... 
+0

我試圖把這作爲我的最後辦法,因爲我懶得創建一個存根類只是爲了測試。 我想我會做這件事。謝謝。 – Juvil

+0

我將此標記爲可能有相同問題的其他人的答案,並考慮是否可以通過嘲弄進行殘片。管他呢。 – Juvil

2

你應該嘲笑IParameter並返回,而不是嘲笑對象新的[] { 「1」, 「2」}

+0

'var mock = new Mock (); var mockparams = new Mock >(); mockparams.SetReturnsDefault(); //我應該怎樣調用以添加{「1」,「2」,「3」} mock.Setup(x => x.ReportTypes).Returns(mockparams.Object);' 我應該調用什麼函數要設置mockparams對象 – Juvil

+0

中的值,請不要發佈評論這樣多的代碼(沒有人可以閱讀它)。更好地編輯你的問題。 – sloth

+0

對不起。要編輯我的文章 – Juvil