我正在使用:MSTest
,Entity Framework 6
和Moq
我正在尝试通过我们现有的实体框架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。然后您可以mock the DbContext(如果您使用“工厂”路线,则使用模拟工厂或假工厂)。