2017-03-02 53 views
1

我第一次使用Lambda表達式並試圖瞭解如何執行此操作。我遵循這個測試文件中已經存在的模式,但是我的調用有一個額外的複雜層,因爲我需要查看每個對象的內部以選擇所有具有將在測試。使用Lambda表達式查找具有匹配標識的所有對象

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)); 

的問題是,這只是搜索表面水平的對象,它不搜索對象的屬性。我錯過了選擇所有myObjects與匹配的ID?

的倉庫接口

public interface IMyObjectRepository 
{ 
    void Put(myObject object) 
    void Delete(Guid appId); 
    myObject Load(Guid appId) 
    IEnumerable<myObject> LoadByPoolId(Guid poolId); 
} 
+0

顯示被模擬的類/接口的定義。從您當前的代碼中,我們仍然猜測它是什麼。提供一個可用於重現問題的[mcve]。 – Nkosi

+0

我沒有包括它,因爲我真的不認爲這會有所幫助,但是你去了! – jlee

回答

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

+0

謝謝你,我最接近的嘗試是SO關閉,但我已經在那裏返回>。對此,我真的非常感激! – jlee

+0

很高興幫助。花些時間閱讀文檔。快樂編碼! – Nkosi

0

LINQ的Where方法接受一個lambda表達式,它允許你進行任何檢查你的願望。編寫一個表達式,對於希望包含的行,計算結果爲true,否則寫入false。

在你的情況下,表現會o.id == targetGUID所以只需將其插入拉姆達體:

var filteredList = list.Where(o => o.id == targetGUID); 
相關問題