【发布时间】:2017-12-14 06:16:42
【问题描述】:
当我意识到我在某些情况下编写代码的方式不同时,我和一位同事正在谈论单元测试......
如果我自己使用实体框架,我会倾向于通过using 块使用IDisposable 接口:
using (Context ctx = new Context()) { whatever(); }
但是当我编写将进行单元测试的代码时,我将上下文的实例化移动到构造函数中,以便我可以传入模拟来代替使用。我知道这是一种依赖注入,特别是“构造函数注入”。
粗略看了一下,我在几篇文章中看到了后一种模式推荐:
- Mocking Entity Framework when Unit Testing ASP.NET Web API 2
- Entity Framework Testing with a Mocking Framework (EF6 onwards)
这个问题(正如我和我的同事所反映的那样)是 dispose 方法永远不会被调用。我想这些对象在超出范围时会最终确定,但这似乎不太理想。
所以,我的问题是:有没有办法将依赖注入与使用 IDisposable 结合起来?
我可以想象三种可能的答案:
- “是的,有一种方法,方法如下……”
- “不,没有办法。这是你必须忍受的。”
- “汤姆,你完全误解了一些东西。”
不管是什么,我们都将不胜感激!
【问题讨论】:
-
3.当您将其配置为时,容器将处理它。这意味着您不必再在代码中使用
using () { }。 -
如 CC 所说,如果您的对象在正确的时间实现
IDisposable,则容器将调用Dispose,具体取决于您的注册方式。 -
您使用的是什么 DI 框架?或者您是否使用构造函数链接并从默认构造函数传入一个新的
DbContext实例(即,您没有使用 DI 框架)。 -
@Igor 后者。我们只使用 DI 来注入模拟数据库上下文,所以我们没有使用成熟的 DI 容器。
标签: .net entity-framework unit-testing dependency-injection constructor-injection