当前位置: 首页 > 知识库问答 >
问题:

TestInitialize上集成测试中多个上下文的一个事务

隆礼骞
2023-03-14

我正在编写集成测试,我想使用事务范围。我们使用EF和带有上下文的存储库。

[TestInitialize]
public void RuleEngineTestsStart() {
    customContext = new CustomContext();
    transaction = customContext.Database.BeginTransaction();
    repo = new CustomRepository(customContext);

    // I need to make this context to work in the same transaction as above
    anotherContext = new AnotherContext();
    anotherRepo = new AnotherRepository(anotherContext);
}

编辑在评论中我被要求包括更多的代码,然而,我认为没有必要回答我的问题。

customContext = new CustomContext();
repo = new CustomRepository(customContext);

customContext2 = new CustomContext2();
otherRepository = new CustomRepository2(customContext2);

// class to be tested needs both repositories
ToBeTestedClass cl = new ToBeTestedClass(customRepository, otherRepository);

// "BASE" interface
public interface IRepository<TEntity> where TEntity : class
{
    TEntity GetById(long id);
    IEnumerable<TEntity> GetByFilter(Expression<Func<TEntity, bool>> predicate);
    TEntity GetSingleByFilter(Expression<Func<TEntity, bool>> filter);
    void Insert(TEntity entity);
    void Delete(long id);
    void Update(TEntity entity);
    ...
}

 // BASE CLASS
 public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
    protected readonly DbContext _context;
    protected readonly DbSet<TEntity> _dbSet;

    public Repository(ColldeskDbContext context)
    {
        _context = context;
        _dbSet = context.Set<TEntity>();
    }

    // GetSingle, GetAll, Insert, Update etc.

  }

  // CustomRepository (other Repositories are similar, with custom methods)
  public interface ICustomRepository : IRepository<CusotmData>
   {
         // some specific methods that are not in Base class   
   }

  public class CustomRepository: Repository<CustomData>, ICustomRepository
  {
    public CustomRepository(CustomContext context) : base(context)
    {
    }
    // custom methods that are specific for given context
  }

  // Contexts - each context consists of its one DbSets

共有1个答案

龙嘉玉
2023-03-14

不要在存储库中使用dbcontext.saveChanges()。在创建存储库时使用一个dbContext。示例:

        using ( var db = new YourDbContext() )
        {
            // Create and begin transaction
            using ( var transaction = db.Database.BeginTransaction() )
            {
                try
                {
                    // ONE dbContext for all repositories
                    var firstRepo = new Custom1Repository(db);
                    var secondRepo = new Custom2Repository(db);

                    City city = new City { Description = "My city" };
                    Street street = new Street { Description = "My street", City = city};
                    firstRepo.Insert(city);
                    secondRepo.Insert(street);

                    // Save all your changes and after that commit transaction
                    db.SaveChanges();
                    transaction.Commit();
                }
                catch ( Exception ec)
                {
                    transaction.Rollback();
                }
            }
        }

这样做,您的存储库就变成了dbset 上的包装器

 类似资料:
  • 我有一个Spring Boot项目,其中定义了几个apiendpoint。我目前正在为每个API编写集成测试。我的测试类注释如下。 现在,对于我的每个测试类,都会设置一个新的上下文来执行它们,这需要时间。我更喜欢将每个apiendpoint的测试用例保存在单独的类中,以便在逻辑上组织它们,但我不希望每次添加新的控制器类和相应的测试类时,我的测试执行时间都会猛增。我在这里做错了什么?

  • 我创建了多个spring-boot测试类(使用1.4.0)。 FirstActionTest。java: 第二个动作测试。java: 运行测试时通过: 运行测试 它似乎为每个测试类创建了一个Spring测试上下文,我想这不是必需的。 问题是: 可以在多个测试类之间共享单个spring测试上下文吗?如果可以,如何共享

  • 问题内容: 我正在使用通过上下文传递的函数。 现在我用。这可行。 如果我需要来自两个不同父组件的函数,该怎么办? 问题答案: 您仍然可以通过16.3 Context API来使用子级功能消费者节点,这是React文档建议的做法: 要在组件的上下文中使用函数,通常将组件包装在HOC中,以便将上下文作为prop传递: 如果您正在运行React 16.8+,则还可以使用钩子更干净地执行此操作,而无需使用

  • 问题内容: 由于Go中的错误处理,我经常会遇到多个值函数。到目前为止,我的管理方式非常混乱,我正在寻找编写更简洁代码的最佳实践。 假设我具有以下功能: 我如何优雅地分配一个新变量。在引入错误处理之前,我的函数刚刚返回,我可以简单地做到这一点: 现在,我这样做: 有没有办法直接访问第一个返回的变量? 问题答案: 如果是多值返回函数,则在调用函数时不能引用具有特定结果值的字段或方法。 如果他们中的一个

  • 我们有一个spring组件,它将应用程序上下文设置为一个静态字段。然后从应用程序的其他部分访问该静态字段。我知道不应该使用,但有时需要从非spring管理的bean访问spring上下文。例如。字段如下所示: (取自http://www.dcalabrise.com/blog/java/spring-context-static-class/) 问题在于,当在集成测试中使用JUnit(或Spock

  • 我有一个带有主窗口的应用程序。它有自己的线程和opengl上下文。这个应用程序每个处理器还有一个工作线程来创建和上传软件渲染的纹理。这工作得非常好。 我担心的是工作线程opengl上下文是使用主窗口的device_context创建的。因此,在双处理器系统的情况下,这意味着3个opengl上下文被绑定到同一个window device_context。它们都是在主窗口线程中创建的,然后调用shar