[英]Lambda expression arguments
我正在嘗試為Moq創建一個擴展方法,我可以在其中發送一個表達式,用於異步返回函數。 但是這個問題並不是特定的Moq。 這是我到目前為止所擁有的:
public static IReturnsResult<TMock> ReturnsAsync<TMock, TResult, T>(this IReturns<TMock, Task<TResult>> setup, Func<T, TResult> valueFunc) where TMock : class
{
return setup.Returns(Task.FromResult(valueFunc.Invoke(default(T))));
}
這就是我希望使用它的方式。
repo.Setup(x => x.FindAsync(It.IsAny<Expression<Func<T, bool>>>())).ReturnsAsync((Expression<Func<T, bool>> e) => context.GetSet<T>().FirstOrDefault(e));
現在我真的不知道所有這些是如何工作的,我無法弄清楚的是如何將表達式傳遞給ReturnsAsync函數,因此我可以將它用作參數而不是默認值(T)我把它作為占位符。
正如預期的那樣,“e”變量在此變為空。
這個方法可以做你想要的:
public static IReturnsResult<TMock> ReturnsAsync<TMock, TResult, T>(
this IReturns<TMock, Task<TResult>> setup,
Func<Expression<Func<TResult, T>>, TResult> valueFunc)
where TMock : class
{
return setup.Returns<Expression<Func<TResult, T>>>(
e => Task.FromResult(valueFunc(e)));
}
然后像這樣使用它:
repo.Setup(x => x.FindAsync(It.IsAny<Expression<Func<T, bool>>>()))
.ReturnsAsync<IRepository, int, bool>(e => context.GetSet<T>().FirstOrDefault(e));
本質上,此版本的ReturnsAsync
采用一個期望謂詞函數(即e
)並返回T
函數。 這允許您對測試數據集執行謂詞( context.GetSet<T>.FirstOrDefault
)。 另外,我使用了接受類型參數的Returns
的重載; 這用於將Setup
調用中的參數轉發給指定為Returns
參數的函數。
您的版本的簽名僅指定了謂詞,因此您無法針對測試數據執行它。 您還在valueFunc
參數的類型中向后反轉了T
和TResult
類型參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.