我在项目中使用Linq to SQL。我有一部分代码调用
DataContext db = new DataContext()
这在运行网站时按预期工作,但是当我从单元测试中调用它时,我得到一个未设置为实例的错误对象...
你知道为什么会这样吗?
我知道我应该模拟测试的数据上下文,但是只有两个测试使用了我需要在项目的这个阶段完成的测试。然后我会进去和模拟。
我只是不明白为什么它不起作用。
编辑:
在我的控制器中,我有一行
CandidateRegistrationViewModel viewModel = new CandidateRegistrationViewModel("PersonalDetails", candidate);
模型有一个成员db:
public class CandidateRegistrationViewModel
{
private EmployDirectDataContext db = new EmployDirectDataContext();
然后该类使用db来填充选择框。
这一切都在我运行时有效但在单元测试中我在创建datacontext时出错。
[TestMethod]
public void PersonalDetailsStepPostShouldRedisplayIfDOBSuppliedInWrongFormat()
{
// Arange
var controller = CreateCandidateController("Dean");
repository.Add(FakeCandidateData.CreateCandidate(controller.member.UserId()));
FormCollection formCollection = FakeCandidateData.CreatePersonalDetailsStepFormCollection();
formCollection["DOB"] = "24/2009/87"; //DOB in wrong format - should be dd/mm/yyyy
controller.ValueProvider = formCollection.ToValueProvider();
// Act
ViewResult result = (ViewResult)controller.PersonalDetailsStep(formCollection);
// Assert
Assert.AreEqual("", result.ViewName); //ViewName is returned as empty if same as Action name
}
两个项目在app / web.config中都有相同的连接字符串
<add name="EmployDirectDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\EmployedDirectDB.MDF;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
答案 0 :(得分:0)
测试数据上下文更多地属于集成测试的范围。模拟更适合您的存储库界面。在集成测试期间,您的存储库将保存对DataContext对象的有效引用。
答案 1 :(得分:0)
您的单元测试程序集可能没有将正确的连接字符串编译到设置中。这就是我一直使用的原因:
var db = new MyDataContext(SomeConfigClassIMade.ConnString) {...}
所以我可以更严格地控制连接字符串的工作方式。
答案 2 :(得分:0)
我不确定你为什么要测试DataContext本身...(我可能错了,我相信有人会告诉我,如果我)但你是否只测试使用DataContext的DataAccess或Repository类......
除此之外,它可能只是没有正确的连接字符串...