簡體   English   中英

Lambda表達式參數

[英]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參數的類型中向后反轉了TTResult類型參數。

暫無
暫無

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

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