Пожалуйста, просмотрите мою тестовую архитектуру (в базе данных памяти) - PullRequest
0 голосов
/ 18 октября 2010

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

Это (основной) метод, который я хочу проверить:

public void Accept(long resumeId)
{
   // Get the resume that has to be accepted
   Resume originalResume = ResumeDAC.GetById(id);

   // Make a copy of the resume
   Resume resumeCopy = CopyResume(originalResume );

   // Accept the original resume and lock it
   originalResume .AcceptAndLock();

   // Accept the copy and keep it open for editing
   resumeCopy.AcceptAndKeepOpen();

   // Add the copy to the database
   ResumeDAC.Add(resumeCopy);

   // Commit everything
   ResumeDAC.Commit();
}

Что я хочупроверить это:

  • Исходное резюме имеет статус «AcceptedAndLocked»
  • Скопированное резюме имеет статус «AcceptedAndOpen»
  • Скопированное резюме было добавлено вбаза данных

Я не хочу использовать реальную базу данных в этом тесте, но у меня есть два класса, которые используют базу данных: EmployeeDAC и ResumeDAC.EmployeeDac очень прост, поэтому я высмеял его с помощью Rhino Mocks.Я думаю, что ResumeDAC немного сложнее, потому что «копия резюме» создается и добавляется в базу данных.Я хочу заявить, что копия резюме добавлена ​​в базу данных.

Давайте посмотрим на мой тестовый код:

[TestMethod]
public void TestAcceptResume()
{
   // Arrange
   // These two classes are used for database actions
   EmployeeDAC mockEmployeeDAC = ArrangeEmployeeDAC(); // Simply mocked with Rhino Mocks
   TestResumeDAC mockResumeDac = new TestResumeDAC(); //I've created my own test double. See below

   // Inject the two Data Access Classes into the ResumeService
   var resumeService = new ResumeService("", mockResumeDac, mockEmployeeDAC);

   // Act
   var resume = resumeService.Accept(3);

   // Assert
   Resume origResume = mockResumeDac.Resumes.Single(it => it.Id == resumeId);
   Assert.AreEqual("AcceptedAndLocked", origResume.StatusName);
   Assert.AreEqual(4, mockResumeDac.Resumes.Count); // Expect 4 records in the database
}

Это мой собственный тестовый вариант ResumeDAC (Класс доступа к данным)используется в тесте

internal class TestResumeDAC : ResumeDAC
{
   public TestResumeDAC() : base()
   {
      Resumes = new List<Resume>();

      // Add resumes to the list
      AddResumes();
   }

   public List<Resume> Resumes { get; set; }

   public override void Add(Resume resume)
   {
      Resumes.Add(resume);
   }

   public override void Commit()
   {
   }

   public override Resume GetById(long id)
   {
      return Resumes.SingleOrDefault(it => it.Id == id);
   }
}

Как вы можете видеть, я сделал вид базы данных в памяти.Это позволяет мне легко видеть, добавляются или удаляются объекты и т. Д.

Итак, мой вопрос: как вам этот код?Пожалуйста, дайте мне знать, если это не тот путь или какие-либо ошибки, которые я сделал в своих мыслях, советах и ​​т. Д.

1 Ответ

1 голос
/ 18 октября 2010

Я предполагаю, что этот код не работает для вас. Это? Вы не сказали ...

Во всяком случае, я долго смотрел на модульное тестирование по поручению одного из моих менеджеров. Я закончил тем, что использовал «Искусство модульного тестирования» Роя Ошерова. Это очень хорошее введение в модульное тестирование.

Похоже, вы сделали ResumeDAC статическим классом. Чтобы переопределить его с помощью вашего тестового класса ResumeDAC, вам придется избавиться от статических вызовов методов.

В любом случае, рассматриваемая проблема, вероятно, заменяет ResumeDAC вашей тестовой версией класса. Это называется «внедрение зависимости».

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