我正在尝试为我的n层Web应用程序创建一堆MS visual studio单元测试但由于某种原因我无法运行这些测试而且出现以下错误 -
“对象引用未设置为 对象的实例“
我正在尝试做的是测试我的数据访问层,我使用LINQ数据上下文类来执行某个函数并返回结果,但是在调试过程中我发现所有测试都会尽快失败他们到达LINQ数据上下文类,它与连接字符串有关,但我无法弄清楚问题是什么。
测试调试失败了(第二行):
public EICDataClassesDataContext() :
base(global::System.Configuration.ConfigurationManager.ConnectionStrings["EICDatabaseConnectionString"].ConnectionString, mappingSource)
{
OnCreated();
}
我的测试如下:
TestMethod()]
public void OnGetCustomerIDTest()
{
FrontLineStaffDataAccess target = new FrontLineStaffDataAccess(); // TODO: Initialize to an appropriate value
string regNo = "jonh"; // TODO: Initialize to an appropriate value
int expected = 10; // TODO: Initialize to an appropriate value
int actual;
actual = target.OnGetCustomerID(regNo);
Assert.AreEqual(expected, actual);
}
我从DAL调用的方法是:
public int OnGetCustomerID(string regNo)
{
using (LINQDataAccess.EICDataClassesDataContext dataContext = new LINQDataAccess.EICDataClassesDataContext())
{
IEnumerable<LINQDataAccess.GetCustomerIDResult> sProcCustomerIDResult = dataContext.GetCustomerID(regNo);
int customerID = sProcCustomerIDResult.First().CustomerID;
return customerID;
}
}
所以基本上一切都在到达DA层方法的第一行并且它试图实例化LINQ数据访问类时失败...
我花了大约10个小时试图解决问题,但没有结果......我真的很感激任何帮助!
更新 最后我修复了这个!!!! :)我不知道为什么但是由于某些原因在app.config文件中与我的数据库的连接如下:
AttachDbFilename = | DataDirectory目录| \ EICDatabase.MDF
所以我做的就是改变路径而不是| DataDirectory |我把实际路径放在我的MDF文件所在的位置,即
C:\ Users \ 1 \ Documents \ Visual Studio 2008 \ Projects \ EICWebSystem \ EICWebSystem \ App_Data \ EICDatabase.mdf
我做完之后就解决了!但是仍然有点不清楚是什么问题...可能是错误的数据库路径?我的ASP.NET项目的web.config包含| DataDirectory | \ EICDatabase。 MDF路径虽然..
答案 0 :(得分:2)
LINQDataAccess.EICDataClassesDataContext
是否正在寻找web.config或其他一些外部数据源进行设置?
我可以告诉你一个事实,你必须通过箍来让web.config
访问你的测试代码。
更新的
没错。我看到您在测试失败的行上使用ConfigurationManager
... ConfigurationManager
查找web.config以进行配置。当我写测试时,这对我来说是一个棘手的问题。
您需要更改代码,以便可以在没有web.config的情况下实例化类,或者您需要进行实验以使测试可以访问web.config。
答案 1 :(得分:2)
您的测试项目是否拥有自己的配置文件?这种行为通常意味着应用程序无法找到连接字符串。测试项目需要自己的文件,因为它们没有在客户端应用程序的上下文中运行。
更新在测试基于SQLExpress构建的Web应用程序并附加.mdf时,添加app.config后所描述的错误很常见。 SQLExpress一次不能在多个进程中运行。因此,如果您之前运行过您的Web应用程序,它可能仍处于活动状态,并且会与附加数据库的尝试发生冲突。
您可以使用SQL Management Studio永久附加数据库,然后使用更传统的连接字符串,如:
Server=myServer;Database=EICDatabase;Trusted_Connection=True;
答案 2 :(得分:0)
对我来说,似乎您的问题是连接字符串,未设置。 我假设您的单元测试与DAL不同。 在没有连接字符串的情况下,在datacontext构造函数上调用'new'命令。所以它通常应该在设置时使用它的默认值。但由于此设置通常存储在另一个项目的web.config中,因此没有设置连接字符串,您将收到错误。
如果它正确,我认为,你必须从DAL项目获得设置到单元测试项目。最简单的解决方案应该是将web.config连接字符串复制到单元测试项目的app.config。
还有其他可能性,但我认为将web.config配置放入单元测试项目并不容易。