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

问题描述 投票:0回答:1

我正在使用:MSTestEntity Framework 6Moq

我正在尝试通过我们现有的实体框架asp.net应用程序学习TDD。现在,我正在使用我们的Web api,我创建了一个新的测试项目和类,并试图编写一个测试以查看是否可以收回至少一个值。因此,在某些地方,我显然不得不为已经存在的代码编写测试。

这里我不知道是否/如何设置我的测试项目,类或方法(不确定哪个需要设置)以测试此方法

[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") {}

    ...
}

我在这里有什么选择?有没有办法让Moq处理此问题,还是我需要以某种方式更新测试项目?我现在不想做的是重做一些事情,这将使我不得不更改应用程序的其他核心部分。

c# entity-framework-6 asp.net-web-api2 moq mstest
1个回答
0
投票

处理这种情况的典型方法是更改​​要测试的类,以使其注入DbContext本身或生成DbContext的工厂。这样,它不是依靠new单独建立DbContext,而是依靠依赖注入配置来确定如何创建DbContext。然后您可以mock the DbContext(如果您使用“工厂”路线,则使用模拟工厂或假工厂)。

© www.soinside.com 2019 - 2024. All rights reserved.