Сделайте метод тестируемым для модульных тестов c # - PullRequest
0 голосов
/ 24 апреля 2018

Итак, у меня есть следующая структура кода

public void method1(int index)
{
   switch(index)
   {
       case 1:
           Method2();break;
       case 2:
            Method3();break;
   }
 }

 public void Method2()
 {
     var entity = new SomeEntity();
     repo.Add(entity);

     var anotherEntity= new AnotherEntity();
     repo.Update(anotherEntity);
 }

При покрытии method2 модульным тестом, я столкнулся с проблемой, что если я хочу проверить добавление этой сущности в db, в любом случае он также запускает метод обновления. Как я могу как-то разделить это, просто хочу получить, возможно, некоторые лучшие методики для метода, в котором нужно делать несколько операций с БД. Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

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

Таким образом, вы получили два теста: один для обновления и один для добавления.Вы можете смоделировать репозиторий и проверить, что методы Add и Update вызываются с ожидаемыми аргументами.Или будет лучше, если вы сможете использовать базу данных "InMemory" и иметь тесты, которые также охватывают персистентный слой.

Это нормально, что Update, выполненный также в тесте для Add, вы будете утверждать только поведениеAdd и игнорируйте Update метод.

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

В вашем случае, если обновление другой сущности является частью логики добавления другой - она ​​должна оставаться в одном классе / методе и проверяться как единое целое.

0 голосов
/ 24 апреля 2018

Прежде всего, Method2 () нарушает принцип единой ответственности SOLID

Принцип единой ответственности : класс должен иметь только одну ответственность (т. е. изменения только в одной части спецификации программного обеспечения должны влиять на спецификацию класса).

Эти операции должны выполняться в своих собственных методах и при этом приведут к:

  • Лучшая ремонтопригодность
  • Лучшие возможности для написания юнит-тестов.

    public void Method2()
    {
    //This method only adds new entities
     var entity = new SomeEntity();
     repo.Add(entity);
    }
    
    public void Method3()
    {
     //This method only updates entities
     var anotherEntity= new AnotherEntity();
     repo.Update(anotherEntity);
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...