【问题标题】:Integration tests - Setup data in database集成测试 - 在数据库中设置数据
【发布时间】:2017-10-20 12:32:53
【问题描述】:

我需要为暴露服务方法的层编写集成测试。但是我需要我的数据库处于某种状态才能通过测试

例如,为了测试 GetStoreByID 方法,我需要在我的数据库中存储 1 而不是存储 2(用于 ko 测试)

数据库由另一个团队使用 sql 项目 (dacpac) 开发和部署

我使用 Entity Framework 6.1.3 和 Edmx

在这种情况下,测试前在数据库中设置数据的最佳方法是什么?

【问题讨论】:

  • 与您的问题有点无关,但是让两个团队集成在一个数据库上通常被认为是“不是一个好主意”,因为这通常意味着两个团队以“步调一致”的方式工作,即部署到数据库通常需要其他团队同时部署。解决方案是引入某种 API 边界,让您在更改数据库的同时保持向后兼容性。

标签: c# entity-framework-6 integration-testing


【解决方案1】:

此链接https://msdn.microsoft.com/en-us/library/dn314431(v=vs.113).aspx 提供了有关如何通过伪造数据库使用 EF6 编写测试的 Microsoft MSDN 文章。

总之,这篇文章涵盖的主题是“在为您的应用程序编写测试时,通常希望避免访问数据库。 Entity Framework 允许您通过创建一个使用内存中数据的上下文(行为由您的测试定义)来实现这一点。'

【讨论】:

    【解决方案2】:

    如果您的数据访问由接口分隔(即对每种类型使用 IDBSet 之类的东西),我个人会尽可能避免完全依赖数据库,并使用fakedbsets(如果您需要测试存储库/DAL 代码)或仅使用 moq 或 nsubstitute 进行模拟(如果您不这样做)。

    我知道这并不能具体回答您的问题,但根据我的经验,设置测试数据的最佳方法是在内存中进行,并尽可能少地依赖外部依赖项。数据库添加了您在单元/集成测试中不需要依赖的额外移动部分。如果您有一个 CI 服务器等,这也会增加复杂性……而您通常希望避免这种情况。

    【讨论】:

    • 您好!我已经使用 Rhino.Mocks 进行单元测试。我认为在集成测试期间“模拟”依赖关系是不可取的。 EF 6可以使用内存吗?如何预先配置数据?谢谢!
    • 嗨 @Azerty123 我实际上非常喜欢 testdouble 方法,您可以亲自模拟整个上下文。所以基本上你的 EF 数据库集是列表。它确实依赖于您拥有一个实现接口的 dbcontext,然后使用 gist.github.com/rally25rs/1492134 之类的东西充当假数据库集。
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2020-05-25
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多