【问题标题】:Testing Entity Framework Data by Hitting the Database通过访问数据库测试实体框架数据
【发布时间】:2011-11-05 23:14:08
【问题描述】:

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

/// <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 和真实的生产数据。

【问题讨论】:

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


    【解决方案1】:

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

    当我编写命中数据库的测试时,我喜欢在启动时创建数据库并加载默认值,然后再销毁。我不确定这是否是最好的选择,但效果很好。这种方法的问题在于它速度较慢,而且需要编写更多代码。

    【讨论】:

    • 是的,你是对的,如果其他人会去餐桌并将国家名称土耳其更改为其他名称,它将破坏。但我在这里的重点是测试我的 EF 代码是否正常工作。那么,您建议将所有值加载到变量中,然后再使用它们?它会带来什么不同?
    • 不是变量。我在启动时运行创建数据库和数据的 SQL。之后,我的测试运行,它将检查存储库是否返回预期值。我确信数据会在那里,并且我知道会发生什么,因为我当时已经在 SQL 中编写了(即在测试代码中)。不同之处在于您不太依赖数据库的当前状态。如果您的某些测试更改了一行的状态,则需要回滚它,因为下次运行它时,测试可能会失败。
    • 好的。因此,制作数据库副本并在本地运行它也可以处理假数据,对吧?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 2011-11-14
        • 2019-12-17
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        相关资源
        最近更新 更多