单元测试时DataContext崩溃

时间:2009-07-17 23:38:06

标签: asp.net-mvc linq unit-testing

我在项目中使用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" />

3 个答案:

答案 0 :(得分:0)

测试数据上下文更多地属于集成测试的范围。模拟更适合您的存储库界面。在集成测试期间,您的存储库将保存对DataContext对象的有效引用。

答案 1 :(得分:0)

您的单元测试程序集可能没有将正确的连接字符串编译到设置中。这就是我一直使用的原因:

var db = new MyDataContext(SomeConfigClassIMade.ConnString) {...}

所以我可以更严格地控​​制连接字符串的工作方式。

答案 2 :(得分:0)

我不确定你为什么要测试DataContext本身...(我可能错了,我相信有人会告诉我,如果我)但你是否只测试使用DataContext的DataAccess或Repository类......

除此之外,它可能只是没有正确的连接字符串...