在ASP.Net MVC站点的数据层中,我有以下“默认”构造函数:
public class UserPrefsContext : DbContext
{
private static ILog _logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public UserPrefsContext()
: base("Unit4.UserPrefsConString")
{
this.Configuration.LazyLoadingEnabled = false;
_logger.DebugFormat("Connection string being used for UserPrefs db:{0}", Database.Connection.ConnectionString);
Database.SetInitializer<UserPrefsContext>(null);
}
}
我一直在使用Unity作为IoC容器和Moq来模拟数据上下文对象,这些对象被注入到控制器中。这对于单元测试是有效的,但是对于更广泛的集成测试(在网站和数据库之间)我希望上下文能够与“真正的”测试数据库一起工作。
所以,我添加了以下第二个构造函数:
public UserPrefsContext(string testConString)
{
this.Configuration.LazyLoadingEnabled = false;
this.Database.Connection.ConnectionString = testConString;
_logger.DebugFormat("Connection string being used for UserPrefs db:{0}", Database.Connection.ConnectionString);
Database.SetInitializer<UserPrefsContext>(null);
}
我的测试工作正常,但是当我运行网站时,我现在收到错误消息“无法构造类型字符串。您必须配置容器以提供此值”。似乎“某事”试图用第二个构造函数创建一个UserPrefsContext对象。我的猜测是“东西”是System.Web.Mvc.DepnedencyResolver。以下是网站root中的Bootstrapper.cs文件的代码:
public class Bootstrapper
{
public static IUnityContainer Initialise()
{
var container = BuildUnityContainer();
log4net.Config.XmlConfigurator.Configure();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
// e.g. container.RegisterType<ITestService, TestService>();
RegisterTypes(container);
return container;
}
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IESBContext, ESBContext>();
container.RegisterType<IConfigurationManager, WebConfigConfigurationManager>();
}
}
我该如何解决这个问题?
答案 0 :(得分:0)
我从错误的方向接近这个。
解决方案是为控制器提供单个无参数构造函数。集成测试项目现在调用bootstrapper类以确保unity创建所需的db上下文对象。
然后我将连接字符串添加到集成测试项目的app.config,并将其更改为指向每个上下文数据库的特殊测试实例。我能够在集成测试项目中使用保存为.sql脚本的数据预加载这些数据。