通过访问数据库来测试实体框架数据

时间:2011-08-29 11:31:17

标签: c# asp.net unit-testing entity-framework tdd

我试图通过实际访问数据库来测试我的真实数据。我实际上正在测试我的Repository类。这是我正在做的一个例子;

/// <summary>
/// Summary description for Country
/// </summary>
[TestClass]
public class Country {

    public Country() {
        _countryRepo = new CountryRepository();
    }

    private ICountryRepository _countryRepo;

    [TestMethod]
    public void db_should_return_at_least_one_country_as_approved_all() {

        //Act
        var model = _countryRepo.GetAll();

        //Assert
        Assert.IsTrue(model.Count() >= 1);
    }

    [TestMethod]
    public void db_should_return_at_least_one_country_as_approved_true() { 

        //Act
        var model = _countryRepo.GetAll(ApprovalStatus.Approved);

        //Assert
        Assert.IsTrue(model.Count() >= 1);
    }

    [TestMethod]
    public void db_should_return_Turkey_as_country_name_by_id() {

        //Act
        var model = _countryRepo.GetSingle(1000);

        //Assert
        Assert.AreEqual<string>("Turkey", model.CountryName);

    }

    [TestMethod]
    public void db_should_return_Turkey_as_country_name_by_countryISO3166Code() {

        //Act
        var model = _countryRepo.GetSingle("TR");

        //Assert
        Assert.AreEqual<string>("Turkey", model.CountryName);

    }

    [TestMethod]
    public void db_should_return_Turkey_as_country_name_by_GUID() {

        //Act
        var model = _countryRepo.GetSingle(Guid.Parse("9AF174A6-D0F7-4393-AAAD-B168BADEDB30"));

        //Assert
        Assert.AreEqual<string>("Turkey", model.CountryName);

    }

}

这对我的需求很有效,但想知道我是否正在按照本书做到这一点。我真的应该遵循其他任何模式。我不想伪造我的数据,我真正强烈的是测试我的DAL和真实的生产数据。

3 个答案:

答案 0 :(得分:2)

如果其他人(甚至您)访问您的数据库并创建新的已批准国家/地区或更改您的国家/地区名称,您的测试将会失败。你会想:&#34;我的存储库WTH错了,为什么它没有按预期工作?&#34;但是,问题不在于存储库。

当我编写打到数据库的测试时,我喜欢创建数据库并在启动时加载默认值并在之后立即销毁。我不确定这是否是最好的选择,但效果还不错。这种方法的问题在于速度较慢,而且代码更多。

答案 1 :(得分:0)

对于手头的要求,即真正静态且不应被篡改的数据,我认为这是一种有效的方法。

我建议写data-driven tests,而不是为每个国家重复相同的测试用例。

答案 2 :(得分:0)

您应该仅使用静态数据库进行测试,并且测试GetAll的方法应该根据实际预期计数进行断言。如果你断言它至少返回了一条记录,你怎么知道它真的返回了你的预期?您甚至应该通过结果集并测试所有记录是否满足条件(但它通常用于更复杂的条件)。