gpt4 book ai didi

c# - 存储库测试最小化重复

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:26 25 4
gpt4 key购买 nike

A 有一个具有典型场景数据访问层 (DAL) 的应用程序:

  • 使用 Entity Framework (EF) 创建的数据上下文。
  • 将 EF 生成的实体用作整个应用程序的通用 DTO。
  • DAL 包含扩展 RepositoryBase 抽象类的不同存储库,该抽象类实现基本的 CRUD 操作;特定的存储库只有针对其实体类型的特定方法。可以软删除的实体的存储库改为扩展 SoftDeleteRepositoryBase,它本身扩展了 RepositoryBase。

为了提供一些上下文,这里有一些类/接口(interface)。

通用存储库接口(interface):

public interface IRepository<T> : IDisposable where T : class
{
void Add(T entity);
void Update(T entity);
void Obliterate(T entity);
void Obliterate(Expression<Func<T, bool>> where);
T GetById(long id);
T GetById(string id);
IQueryable<T> GetAll();
IQueryable<T> GetMany(Expression<Func<T, bool>> where);
T GetSingle(Expression<Func<T, bool>> where);
void SaveChanges();
}

存储库基础:

public abstract class RepositoryBase<T> : IRepository<T> where T : class
{
...
}

Foo 实体的存储库:

public class FooRepository : RepositoryBase<File>, IFooRepository
{
// Specific methods here
...
}

我应该如何测试存储库?现在我为每个存储库都有一个测试类,所有存储库的测试方法都非常相似,因为它们主要测试来自 RepositoryBase 的通用方法。很明显,我需要针对特定​​方法进行测试,但对于全局通用方法,我是否应该继续针对每个不同的实体进行测试?我不知道假设如果插入例如对 Foo 实体有效,它也适用于其他实体是否明智;然而,针对每个测试在测试创建和维护方面都会增加开销。您能否就此推荐任何最佳做法?

(顺便说一下,这些是集成测试)

谢谢

最佳答案

I don't know if it's wise to assume that if insertion, for instance, works for Foo entities it will also work for others

不,你不能这样假设。如果某些实体没有正确的映射怎么办?如果您忘记定义 DbSet<Bar> 怎么办?在你的 DbContext ?如果您想完全确定,您应该测试所有具体存储库的所有方法。

however testing for each has an added overhead in terms of test creation and maintenance

正确。这就是为什么不是只为存储库编写集成测试,而是为您的应用程序编写验收测试。您将练习整个堆栈并涉及具体的存储库。

关于c# - 存储库测试最小化重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17197465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com