2011-08-18 46 views
0

我們使用EF4併爲DAL層創建測試用例(DAL層具有linq查詢)。我們使用TypeMock作爲嘲諷框架。爲了進行測試,我們正在創造Fakecontext的ObjectContext和嘲諷CreateObjectSet方法如下:如何創建用於測試EF4'Object'的ObjectQuery方法

Isolate.WhenCalled(() => fakeContext.Context.CreateObjectSet<User>)).WillReturnCollectionValuesOf(fakeUsers.AsQueryable()); 

以上是工作的罰款。問題是我們試圖使用'包含'來包含相關表格。我們延長了包括方法如下:

public static IQueryable<T> Include<T>(this IQueryable<T> source, Expression<Func<T>> property) 
{ 
    var objectQuery = source as ObjectQuery<T>; 

    if (objectQuery != null) 
    { 
     var propertyPath = GetPropertyPath(property); 
     return objectQuery.Include(propertyPath); 
    } 

    return source; 
} 

那麼,什麼發生的是,在上述Include方法的源類型應該是ObjectQuery<T>。但由於我們嘲笑CreateObjectSetInclude方法的源類型爲Collection.Generic.List類型。請讓我們知道我們應該如何嘲笑上述案件。您的及時幫助將非常可觀。謝謝

+0

你能格式化至少一個你的問題嗎? –

+0

[如何包含關聯實體]的可能重複(http://stackoverflow.com/questions/7104461/how-to-include-associated-entities) –

回答

0

Object Services編寫單元測試時可能很難使用。不幸的是,沒有一個好的界面來模擬ObjectQuery<T>,就像你發現的那樣。爲了處理這種情況我已經創建了一個包裝類以下Repository模式來封裝我ObjectContext並創建了一個包裝類來封裝ObjectQuery<T>

public interface IMyObjectQuery<T> : IOrderedQueryable<T> 
{ 
    IMyObjectQuery<T> Include(string path); 
} 

public class MyObjectQuery<T> : IMyObjectQuery<T> 
{ 
    private ObjectQuery<T> _query; 

    public MyObjectQuery(ObjectQuery<T> query) 
    { 
     _query = query; 
    } 

    IMyObjectQuery<T> Include(string path) 
    { 
     //There is probably a better way to do this 
     //but you get the idea 
     return new MyObjectQuery(_query.Include(path)); 
    } 

    //Implement IQueryable, IEnumerable... 
} 

然後它是實現倉庫的包裝爲你的ObjectContext的問題。 Here是一個讓你開始的鏈接。

添加這樣的事情:

public class MyRepository : IMyRespository 
{ 
    ... 
    public IMyObjectQuery<T> CreateQuery<T>() 
    { 
     return new MyObjectQuery(_context.CreateQuery<T>()); 
    } 
    ... 
} 

這可能不是你要找的簡單的解決方案,因爲它不是一個簡單的任務。我想你會發現,如果你不這樣做,你會繼續在編寫測試時遇到困難。

相關問題