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



我使用的是: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处理这个问题,或者我需要以某种方式更新测试项目?(在这一点上(我不想做的是返工,这将使我不得不更改应用程序的其他核心部分。

处理此类情况的典型方法是更改正在测试的类,使其注入DbContext本身或生成DbContext的工厂。这样,new就不用自己创建DbContext,而是依赖依赖依赖注入配置来确定如何创建DbContext。然后,您可以模拟DbContext(如果使用factory路由,则使用模拟或伪工厂(。

相关内容

最新更新