如何使用 Moq 测试创建新 DbContext 的方法?

How can I use Moq to test a method that creates a new DbContext?

我正在使用:MSTestEntity Framework 6Moq

我正在尝试使用我们现有的 entity framework asp.net 应用程序学习 TDD。现在我正在我们的网站 api 中工作,我创建了一个新的测试项目,并且 class 我正在尝试编写一个测试,看看我是否至少可以得到一个值。所以在某些地方,我显然必须为已经存在的代码编写测试。

这里我想不出if/how来设置我的测试项目,class,或者方法(不确定哪个需要设置)来测试这个方法

[HttpGet]
[ResponseType(typeof(IEnumerable<TimeZoneDTO>))]
[Route("api/timezone")]
public IHttpActionResult GetTimeZones()
{
    var _out = new IEnumerable<TimeZoneDTO>();
    using (var db = new Entities())
    {
        _out = from x in db.Timezones
               orderby x.UTCOffSet descending
               select new TimeZoneDTO() {
                   Caption = x.Name,
                   Id = x.Abbreviation
               };
    }

    return Ok(_out);
}

问题是 using (var db = new Entities()) 依赖于控制器项目的 web.config 文件中的命名数据库配置字符串。

public partial class Entities : DbContext
{
    public Entities(): base("name=Entities") {}

    ...
}

我在这里有哪些选择?有没有办法让起订量来处理这个问题,或者我是否需要以某种方式更新测试项目?我(此时)不想做的是返工,这将使我不得不更改应用程序的其他核心部分。

处理这种情况的典型方法是更改​​您正在测试的 class,以便它注入 DbContext 本身或生成 DbContext 的工厂。这样,它就不会 new 自己建立 DbContext,而是依赖依赖注入配置来确定 DbContext 的创建方式。然后你可以(使用模拟或假工厂,如果你走工厂路线)。