Изящно закрыть сеанс динамической оси с помощью MSTest

Мы пишем инфраструктуру модульного тестирования с использованием MSTest, чтобы мы могли протестировать проект интеграции инфраструктуры AIF, который у нас есть.

Мы не могли придумать способ использования макетов, поэтому нашим решением было сделать снимок базы данных в начале модульных тестов, а затем восстановить и удалить его в конце с помощью инициализации и очистки сборки.

Затем наша тестовая структура выполняет вход в систему AX для создания необходимых данных, а затем выходит из системы и удаляет их. Затем мы упорядочиваем нужные нам данные и проталкиваем их через службу AIF.

К моменту, когда мы добираемся до восстановления моментального снимка, он падает и говорит, что не может восстановить базу данных, пока другие пользователи используют базу данных. (несмотря на то, что мы убираем сервис после его использования). Мы можем решить эту проблему, запустив перед ним другой SQL-запрос, который перебирает все сеансы и уничтожает их (кроме текущего). Это позволяет БД восстанавливаться правильно, но поскольку мы не корректно закрываем сеансы, служба AX считает, что есть проблема, и отключается, что, как вы можете себе представить, не очень полезно!

Таким образом, у нас есть уловка 22 здесь.

Я не включил сюда какой-либо код, потому что не думаю, что это поможет, но если вы думаете, что это поможет, дайте мне знать.

Пожалуйста, помогите мне, я буквально на пределе своих возможностей!


person Keithin8a    schedule 05.11.2014    source источник


Ответы (1)


Вы всегда должны разделять тесты и производственную базу данных. Не рекомендуется использовать производственную базу данных для тестирования. И тому есть некоторые причины.

  1. OptimisticConcurrencyException — когда вы начали работать с объектной сущностью во время тестового сценария, вы не можете быть уверены, что в конце сценария сущность, с которой вы работаете, не будет изменена каким-либо другим клиентом. Если это произошло, вы получите исключение, которое сделает ваш тест красным и нестабильным.
  2. Вы не можете контролировать каждый вызов функции. Когда вы используете заглушки и макеты, вы хотите проверить какую-то небольшую часть логики с данными, которые вы предоставляете. Если эти данные могут измениться во время тестового сценария, вы не можете быть уверены в результате теста.
  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
        }
    }
person Andrei    schedule 05.11.2014
comment
Проблема в том, что с AX большая часть конфигурации выполняется в разных таблицах базы данных, поэтому нам действительно нужно иметь базу данных там. Сейчас мы пытаемся создать систему, в которой у нас есть поведение снимков, но с самим кодом. Это не очень чистое решение, но оно должно подходить для среды разработки. - person Keithin8a; 07.11.2014