簡體   English   中英

如何簡化 It.IsAny<t> () 用於設置 Mocks 的參數</t>

[英]How to simplify the It.IsAny<T>() parameters for setting up Mocks

在我們的單元測試中,我們經常使用Mock.Setup 這會導致以下陳述:

_mockedModel.Setup(x => x.Method1(It.IsAny<string>(), It.IsAny<object>(),It.IsAny<string>())).Returns(1);
_mockedModel.Setup(x => x.Method2(It.IsAny<string>(), It.IsAny<object>(), It.IsAny<object>())).Returns(1);
_mockedModel.Setup(x => x.Method3(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<string>())).Returns(1);
_mockedModel.Setup(x => x.Method4(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<object>())).Returns(1);

這很冗長,我想簡化It.IsAny<T>()參數。

我們已嘗試執行以下操作:

Func<string> s = It.IsAny<string>;
Func<object> o = It.IsAny<object>;
_mockedModel.Setup(x => x.Method1(s(), o(), o())).Returns(1);
_mockedModel.Setup(x => x.Method2(s(), o(), o())).Returns(1);
_mockedModel.Setup(x => x.Method3(o(), o(), s())).Returns(1);
_mockedModel.Setup(x => x.Method4(o(), o(), o())).Returns(1);

但是,雖然這沒有給出任何錯誤,但它並沒有設置 Mock。 例如,方法 1 到 4 返回 0 而不是 1。

但是,雖然這沒有給出任何錯誤,但它並沒有設置 Mock。 例如,方法 1 到 4 返回 0 而不是 1。

這是因為 Moq Setup明確地在表達式中查找It.IsAny<T>() static 方法調用,以便正確配置設置。 這是設計使然。

通過更改為 function 以嘗試簡化表達式,您可以強制表達式調用返回泛型類型參數的默認值的方法調用。

所以你的表達效果就變成了

_mockedModel.Setup(x => x.Method1(null, null, null)).Returns(1);
//...

@Nkosi 的回答幫助我想出了一個解決方案。 解決方案是將 It.IsAny() 調用放在屬性(或方法)中:

private static string Str => It.IsAny<string>();
private static object Obj => It.IsAny<object>();

這允許代碼編寫如下:

_mockedModel.Setup(x => x.Method1(Str, Obj, Obj)).Returns(1);
_mockedModel.Setup(x => x.Method2(Str, Obj, Obj)).Returns(1);
_mockedModel.Setup(x => x.Method3(Obj, Obj, Str)).Returns(1);
_mockedModel.Setup(x => x.Method4(Obj, Obj, Obj)).Returns(1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM