2016-01-15 4 views
0

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

Я пишу на стороне сервера javascript с узлом и используя rsvp для асинхронных вызовов в резервную копию.

Я строю свои модульные тесты следующим образом.

//Setup 
//Action 
//Assertion 
//Cleanup 

Прямо сейчас, я создаю функцию, которая асинхронно удаляет enteries в базе данных, чтобы мое модульное тестирование выглядит следующим образом.

"deletingFunction_1entry_returns1EntryDeleted": function() { 
     return new rsvp.Promise(function(resolve, reject) { 
     //Setup 
     var DatabaseEntry = { "Info": "Info" }; 
     setup(DatabaseEntry).then(function(xPostedEntries) { 
     //if the setup promise resolves then... 
      //Action 
      xDelete(xPostedEntries).then(function(xDeletedEnteries) { 
       //Assertion 
       if (xPostedEntries === xDeletedEntries) { 
       //if the posted enteries matched the deleted enteries then... 
        resolve(); 
       } else { 
       //otherwise the posted enteries did not match the deleted 
       //enteries so... 
        reject("The posted enteries did not match the deleted enteries."); 
       }  
      }); 
     }, function(xPostedEnteries) { 
     //otherwise the setup promise did not resolve so... 
      //Cleanup 
      /***************************************************************/ 
      /* Here's where I'm having trouble. If the setup fails to post */ 
      /* all of the entries to the database then the test is a  */        
      /* scratch but I want to clean up all the posts that 'were' */ 
      /* posted but to remove them from the database, I'd be using a */ 
      /* deleting function, which is the function that I'm testing. */ 
      /* So how can I redesign my unit test not to use the function */ 
      /* that it's testing.           */ 
      /***************************************************************/ 
      reject("The setup failed."); 
     }); 
}); 

}

Edited: Я написал функцию, которая обрезает таблицу базы данных для очистки, но будет по-прежнему ценят указатели о том, как улучшить свое тестирование.

ответ

0

Это не единичный тест, поскольку он имеет побочные эффекты. Конечно, вы не можете использовать функцию «удалить», которую вы тестируете. Он даже не существует, пока не пройдет его модульные тесты. Тестирование вашего устройства должно быть единиц измерения.

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

+0

Благодарим за отзыв. Что вы подразумеваете под «побочными эффектами»? Есть ли у вас конструктивные комментарии для добавления? Я написал еще одну функцию, которая усекает таблицу базы данных для очистки как быстрое исправление, но я по-прежнему ценю советы по перепроектированию или очистке теста, чтобы он был законным. – ogginger

+0

@ user2480206 вообще не разговаривать с базой данных в модульном тесте. https://en.wikipedia.org/wiki/Side_effect_(computer_science) – djechlin

+0

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