使用Lambda表达式查找具有匹配id的所有对象

时间:2017-03-02 17:17:59

标签: c# unit-testing moq

我第一次使用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);
}

2 个答案:

答案 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列表的表达式。

参考:Moq Quickstart

答案 1 :(得分:0)

LINQ&#39} o.id == targetGUID方法接受一个lambda表达式,允许您执行任何所需的检查。编写一个表达式,对于您希望包含的行,计算结果为true,否则为false。

在你的情况下,表达式为var filteredList = list.Where(o => o.id == targetGUID); ,所以只需将其插入到lambda体中:

{{1}}