2017-02-23 104 views
0

我想爲此設置單元測試。但我見過的每一個實際工作的例子都是這種類型的設置。它將以這種方式工作。單元測試與努力EF6與異步方法

//Setup DBContext 
public MyContext(DbConnection connection) : base(connection, true){} 
//Have some service that gets passed the context etc.. 
public class SomeService() 
{ 
    public SomeService(MyContext passedContext){ 
     Context = passedContext; 
    } 
    public MyContext Context {get;set;} 

    public Book GetBook(int id){ 
    return Context.Books.Find(id); 
    } 
} 

但我有我的設置方式是這樣的,我不能弄清楚如何做到這一點正確沒有打破一切

public class SomeService() 
{ 
    public async Task<Book> GetBook(int id){ 
     using(var context = new MyContext() 
     { 
     return await context.FindAsync(id); 
     } 
    } 
} 

那麼,如何可以測試了這一點,沒有具有上下文屬性並傳遞上下文。因爲從我讀過的東西我不能做異步,因爲DBContext不是線程安全的。但我也不能通過努力測試它,除非我通過所有正確的上下文從努力..

不會工作,因爲我使用每個服務方法使用。

+1

抽象上下文以便在測試時可以替換/模擬。現在數據庫上下文耦合得太緊以允許測試能力 – Nkosi

+0

我該怎麼做,而能夠使用異步?我展示的第一種方式允許我測試,因爲它解耦了Dbcontext,但也使我從異步更改了所有對數據庫的服務調用。 – Dylan

回答

0

Asyns在這裏不是問題。請參閱此問題以查看工具工廠方法: What happens to using statement when I move to dependency injection

+0

所以我需要將dbcontext包裝在工廠中? – Dylan

+0

是的,確切地說。你希望這是可以單獨測試的,對吧?除非你試圖達到我不明白的東西。 – komsky

+0

從我讀過的(http://mehdi.me/ambient-dbcontext-in-ef6/)這種方式基本上是注入的dbcontext,顯然不能很好地與線程工作嗎?我無法弄清楚這個問題的一個好方法。 – Dylan