2017-02-23 78 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