簡體   English   中英

帶有表達式的方法的Moq設置 <Func<t,bool> &gt;論點

[英]Moq Setup for method with expression<Func<t,bool>> argument

我正在嘗試模擬以下存儲庫方法

IEnumerable<T> All(Expression<Func<T, bool>> criteria)

下面的模擬設置工作正常

repository.Setup(repo => repo.All(It.IsAny<Expression<Func<UserLog, bool>>>())).Returns(userLogs);

但是,當我想設置一個特定的表達式時,它不起作用。 調用時,方法“全部”不會返回指定的userlogs對象。

repository.Setup(repo => repo.All(v=>v.UserId==userId)).Returns(userLogs);

我也嘗試了以下方法。 我知道它很丑,但是我很好奇它是否會起作用,而且確實起作用。

repository.Setup(ulr => 
                        ulr.All(It.Is<Expression<Func<UserLog, bool>>>(e => 
                        e.Compile().Invoke(new UserLog { UserId = userId }))))
.Returns(userLogs);

但是,足夠奇怪的是,將笨拙的表達式移到一個單獨的變量中並傳遞給它,這是行不通的。 像下面

var itis = It.Is<Expression<Func<UserLog, bool>>>(e => e.Compile().Invoke(new UserLog { UserId = userId }));
repository.Setup(ulr => ulr.All(itis)).Returns(userLogs);

模擬方法的調用如下:

repository.All(u=>u.UserId==userId);

我想做的是模擬特定Expression>的方法。

我想不通,希望得到一些幫助。

謝謝。

從模擬中檢索傳遞的表達式,並使用linq將其應用於假結果

repository
.Setup(_ => _.All(It.IsAny<Expression<Func<UserLog, bool>>>()))
.Returns((Expression<Func<UserLog, bool>> arg) => userLogs.Where(arg.Compile()));

例如,當用這樣的方式調用嘲笑的成員時

var repo = repository.Object;
var result = repo.All(user => user.UserId == userId);

假設userLogs的類型為IEnumerable<UserLog>userLogs在模擬設置中調用傳遞給user => user.UserId == userIduser => user.UserId == userId表達式。

暫無
暫無

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

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