使用MSTest优雅地关闭动态ax会话

本文关键字:动态 ax 会话 MSTest 使用 | 更新日期: 2023-09-27 18:29:19

我们正在使用MSTest编写一个单元测试框架,以便测试我们拥有的AIF框架集成项目。

我们无法找到使用mock的方法,因此我们的解决方案是在单元测试开始时拍摄数据库的快照,然后在最后使用程序集初始化和清理来恢复和处理它。

然后,我们的测试结构对AX进行登录调用,以创建所需的数据,然后注销并处理。然后,我们安排我们需要的数据,并通过AIF服务进行推送。

当我们恢复快照时,它崩溃了,并表示当其他用户正在使用数据库时,它无法恢复数据库。(尽管我们正在清理使用后的服务)。我们可以通过在它之前运行另一个SQL查询来解决这个问题,该查询循环通过所有会话并杀死它们(除了当前会话)。这允许数据库正确恢复,但由于我们没有优雅地关闭会话,AX服务认为存在问题并自行关闭,正如你所能想象的,这不是很有用!

所以我们这里有一个catch 22的情况。

我没有在这里包含任何代码,因为我认为它不会有任何帮助,但如果你认为它会告诉我。

请帮帮我,我真的到了山穷水尽的地步!

使用MSTest优雅地关闭动态ax会话

您应该始终将测试和生产数据库分开。使用生产数据库进行测试不是一个好主意。这是有原因的。

  1. OptimisticConcurrencyException–当您开始使用实体对象,您不能确定与您一起工作的场景结束实体不会因任何其他客户。如果真的发生了,你会得到一个例外测试为红色且不稳定
  2. 您无法控制每个函数调用。当您使用存根和mock时你想用你提供如果这些数据在测试场景中可以更改,那么您就不能对测试结果有把握
  3. 如果您忘记清理生产中更改的所有数据数据库中,您将用测试数据填充数据库

因此,这些问题的解决方案可能会有所不同。

  • 您可以简单地在构建服务器上使用单独的数据库(仅用于测试)。并将其填入[TestInitialize]方法中(别忘了在[TestCleanup]中清理)
  • 您可以在.net中设置内存中数据库以测试内存中数据库
  • 您可以尝试模拟您的存储库(我不确定您在DAO中使用了什么结构)。但如果它是简单的IRepository,你可以模拟它提供的接口并简单地测试它

    interface IRepository<T> where T : Entity
    {
     IQueryable<T> GetAll();
     bool Save(T entity);
     bool Delete(int id);
     bool Delete(T entity);
     }
    

可以按如下方式进行存根:

 [TestClass]
    public class UnitTest1
    {
        private IRepository<Entity> _repository;
        private SomeService _target;
        [TestInitialize]
        public void SetUp()
        {
            _repository = MockRepository.GenerateStub<IRepository<Entity>>();
            _target = new SomeService(_repository);
        }

        [TestMethod]
        public void TestMethod1()
        {
            _repository.Stub(x => x.GetAll()).Return(new List<Entity>().AsQueryable());
            //Test your target
        }
    }