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

时间:2014-11-05 15:30:19

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

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

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

然后,我们的测试结构会对AX进行登录,以创建我们需要的数据,然后注销并进行处理。然后我们安排我们需要的数据并将其推送到AIF服务中。

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

所以我们在这里遇到了一个问题。

我没有在这里包含任何代码,因为我认为它不会有任何帮助,但如果您认为它会让我知道。

请帮帮我,我的绳索尽头!

1 个答案:

答案 0 :(得分:0)

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

  1. OptimisticConcurrencyException - 当你开始使用时 在测试场景中的实体对象,你不能确定在 您使用的场景实体的结尾不会被任何更改 其他客户。如果它发生了你会得到例外,这使你的 测试红色和不稳定。
  2. 您无法控制每个函数调用。当你使用存根和模拟时 你想用你的数据检查一些小的逻辑 提供。如果这些数据在测试场景中可能会发生变化,那么您就无 确定测试结果。
  3. 如果您忘记清除生产中更改的所有数据 数据库,你将用测试数据填入你的数据库。
  4. 因此,这些问题的解决方案可能会有所不同。

    • 您可以在构建服务器上使用单独的数据库(仅用于 测试)。并用[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
            }
        }