我第一次使用Lambda表达式并尝试了解如何执行此操作。我正在遵循这个测试文件中已存在的模式,但是我的调用有一个额外的复杂层,我需要查看每个对象内部以选择所有具有将在以下时提供的id的内容。测试。
myobject.cs
public class myObject
{
public myObject()
{
this.id = Guid.Empty;
this.poolId = Guid.Empty;
this.name = string.Empty;
this.URL = string.Empty;
}
public Guid id { get; set; }
public Guid poolId { get; set; }
public string name { get; set; }
public string URL { get; set; }
}
testfile.cs
Mock<IMyObjectRepository> mock = new Mock<IMyObjectRepository>(MockBehavior.Strict);
List<myObject> objects = new List<myObject>();
mock.Setup(r => r.LoadByPoolId(It.IsAny<Guid>()))
.Returns<IEnumerable<myObject>>(objList => objects.Where(obj => objList.Contains(obj.id));
问题是,这只搜索表面级对象,它不搜索对象的属性。我错过了选择具有匹配ID的所有myObjects
的内容是什么?
存储库界面
public interface IMyObjectRepository
{
void Put(myObject object)
void Delete(Guid appId);
myObject Load(Guid appId)
IEnumerable<myObject> LoadByPoolId(Guid poolId);
}
答案 0 :(得分:1)
使用提供的示例
var mock = new Mock<IMyObjectRepository>();
var objects = new List<myObject>();
//...populate objects
// access invocation arguments when returning a value
mock.Setup(r => r.LoadByPoolId(It.IsAny<Guid>()))
.Returns((Guid arg) => objects.Where(obj => obj.poolId == arg));
在Returns
表达式中,提供的参数将传递给用于过滤objects
列表的表达式。
答案 1 :(得分:0)
LINQ&#39} o.id == targetGUID
方法接受一个lambda表达式,允许您执行任何所需的检查。编写一个表达式,对于您希望包含的行,计算结果为true,否则为false。
在你的情况下,表达式为var filteredList = list.Where(o => o.id == targetGUID);
,所以只需将其插入到lambda体中:
{{1}}