0

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

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

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

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

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

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

请帮助我,我真的处于我的束缚的尽头!

4

1 回答 1

0

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

  1. OptimisticConcurrencyException – 当您在测试场景期间开始使用实体对象时,您无法确定在您使用的场景结束时,您使用的实体不会被任何其他客户端更改。如果发生这种情况,您将得到异常,这会使您的测试变红且不稳定。
  2. 您无法控制每个函数调用。当您使用存根和模拟时,您希望使用您提供的数据检查一些小逻辑。如果此数据在测试场景中可能发生变化,则您无法确定测试结果。
  3. 如果您忘记清理您在生产数据库中更改的所有数据,您将使用测试数据填充您的数据库。

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

  • 您可以简单地在构建服务器上使用单独的数据库(仅用于测试)。并将其填写在 it[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
        }
    }
于 2014-11-05T16:48:49.807 回答