【问题标题】:Gracefully close an dynamics ax session using MSTest使用 MSTest 优雅地关闭动态 ax 会话
【发布时间】:2014-11-05 15:30:19
【问题描述】:

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

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

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

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

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

我没有在此处包含任何代码,因为我认为它没有任何帮助,但如果您认为它会告诉我。

请帮帮我,我真的没救了!

【问题讨论】:

    标签: c# unit-testing session dynamics-ax-2012 aif


    【解决方案1】:

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

    1. OptimisticConcurrencyException – 当您开始使用 在测试场景中的实体对象,你不能确定在 您使用的场景实体的结尾不会被任何更改 其他客户。如果它发生了,你会得到异常,这会让你的 测试红色且不稳定。
    2. 您无法控制每个函数调用。当您使用存根和模拟时 你想用你的数据检查一些小逻辑 提供。如果这些数据在测试场景中可以改变,你就不能 确定测试结果。
    3. 如果您忘记清理您在生产中更改的所有数据 数据库,您将在数据库中填写测试数据。

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

    • 您可以简单地在构建服务器上使用单独的数据库(仅用于 测试)。并填写[TestInitialize]方法(别忘了 在[TestCleanup] 中清理它。
    • 您可以在内存数据库中设置用于测试In memory database in .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
            }
        }
    

    【讨论】:

    • 问题是,对于 AX,很多配置是在数据库中的各种不同的表中完成的,所以我们实际上需要在那里有数据库。我们现在正在尝试创建一个系统,其中我们基本上拥有快照的行为,但具有代码本身。这不是一个非常干净的解决方案,但它应该适合开发环境。
    猜你喜欢
    • 2013-01-04
    • 2017-01-02
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2014-12-01
    • 2020-06-29
    • 2021-06-03
    • 2014-11-03
    相关资源
    最近更新 更多