我想moq一個有索引的屬性,我希望能夠在回調中使用索引值,就像你可以使用方法一樣moq'd方法的回調參數。可能比較容易證明一個例子:Moq索引屬性,並使用返回/回調中的索引值
public interface IToMoq
{
int Add(int x, int y);
int this[int x] { get; set; }
}
Action<int, int> DoSet = (int x, int y) =>
{
Console.WriteLine("setting this[{0}] = {1}", x, y);
throw new Exception("Do I ever get called?");
};
var mock = new Mock<IToMoq>(MockBehavior.Strict);
//This works perfectly
mock.Setup(m => m.Add(It.IsAny<int>(), It.IsAny<int>()))
.Returns<int, int>((a, b) => a + b);
//This compiles, but my callback never seems to be called
mock.SetupSet(m => m[It.IsAny<int>()] = It.IsAny<int>())
.Callback(DoSet);
var obj = mock.Object;
Console.WriteLine("Add(3,4) => {0}", obj.Add(3, 4)); //Works perfectly
obj[1] = 2; //Does not throw, why?
編輯:爲了澄清,我想爲get
回調/收益法是Func<int,int>
,併爲set
回調/收益法是Action<int,int>
。試圖邁克建議,您可以排序的做到這一點的set
,但有一個主要的限制:
mock.SetupSet(m => m[23] = It.IsAny<int>())
.Callback(DoSet).Verifiable();
回調DoSet
的確然後用值(23,<any>)
調用。不幸的是,使用It.IsAny<int>()
而不是23
似乎表現爲0
,而不是<any>
。
此外,我找不到SetupGet
與Returns
的方式,其中Returns
需要Func<int,int>
甚至編譯。
可以使用Moq嗎?
動機:我只是在玩Moq,試圖用它來提供一個流暢的API來執行攔截。也就是說,如果接口I
和的實例I
自動創建一個Mock<I>
代理,其行爲默認爲X
。
直接使用Castle DP可能會更有意義,但我喜歡Moq Expression Tree語法。
看起來像一個bug給我。使用mock.SetupSet設置模擬(c => c [1] = It.IsAny())。Callback(DoSet);'按預期工作,'mock.SetupSet(c => c [It.IsAny ()] = It.IsAny ())。回調(DoSet);'MockBehavior.Strict'失敗,並且不執行'MockBehavior.Loose'。 –
sloth
With'mock.SetupSet(x => x [It.IsAny()] = It.IsAny ())。回調(doSet);''和'obj [0] = 1; obj [1] = 2;'它按照零指數的預期工作。它在索引1(或其他任何事)上失敗。 –
@Rob:你跑哪個版本的Moq?我其實碰到了兩種不同的行爲。我正在檢查Moq的版本,我在兩個單獨的項目中運行,一個似乎工作,另一個不工作。 –