none
Как в Unit-тесте сымитировать вызов метода тестируемого класса? RRS feed

  • Вопрос

  • Здравствуйте!

    Собственно, вопроса два.

    Вот есть класс с методом:

    class ViewModel { public void ReadBody(string arg) { //.... SaveSourceFile(path, body); //.... Process.Start(infoStartProcess);

    }

    public bool SaveSourceFile(string path, byte[] bBody) {

    //... using (FileStream fs = new FileStream(path, FileMode.Create)) { fs.Write(bBody, 0, bBody.Length); fs.Flush(); }

    //... } }


    Мне надо к этим методам написать unit-тест. То есть, как я понимаю, надо сделать некий Mock типа такого:

    Mock<ViewModel> mockModel = new Mock<ViewModel>();

    и в нем установить Setup-ом для SaveSourceFile ответ true. Но как это реально сделать? Ведь вызвать из мока метод ReadBody напрямую нельзя. И как быть с Process.Start()? Его-то уж точно не сымитируешь. Аналогичная проблема с тестированием самого метода SaveSourceFile() (пишущего на диск, что в тесте недопустимо) и с методами, открывающими и закрывающими окна.

    И еще вопрос - а что делать, если метод SaveSourceFile закрыт (не public)? 

    Подскажите, пожалуйста, как это решается. Заранее спасибо.



    • Изменено SvarogichRed 16 ноября 2016 г. 3:10
    16 ноября 2016 г. 2:59

Ответы

  • Добрый день.

    Есть несколько вариантов решения. Например, Fakes Framework. Пример можно посмотреть здесь.

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

    • Помечено в качестве ответа SvarogichRed 16 ноября 2016 г. 10:12
    16 ноября 2016 г. 7:13
    Отвечающий

Все ответы

  • Добрый день.

    Есть несколько вариантов решения. Например, Fakes Framework. Пример можно посмотреть здесь.

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

    • Помечено в качестве ответа SvarogichRed 16 ноября 2016 г. 10:12
    16 ноября 2016 г. 7:13
    Отвечающий
  • Спасибо за наводку. Скажите, а как подключить Microsoft Fakes? ПКМ на любой сборке в проекте возможности создать Fake Assembly не предлагает. На сайте майкрософт я не нашел инфы, что нужно сделать, чтобы активировать Fakes Framework.
    16 ноября 2016 г. 7:43
  • Для начала нужно разобраться, для чего вам тест (Какое поведение, что конкретно нужно тестировать)? Может он не нужен для данного класса. Или просто услышали, что написать юнит тест это "хорошо".

    Какую платформу юнит тестирования вы используете MSTest, xUnit или ещё что? Так как Microsoft Fakes работает в основном только с родной платформой и определённой версией студии.

    Что касается закрытых методов то вот почитайте.


    Сделаем содержимое сообщества лучше, вместе!

    16 ноября 2016 г. 8:14
    Модератор
  • Нужно покрытие проекта тестами в 75 % :) ТЗ такое.

    Сейчас 59%. Для тестирования остались только закрытые или вот такие проблемные методы.

    Использую VS2015 без особых дополнений, namespace Moq. 

    Сейчас по наводке Алексея Лосева нашел на нугете FakeItEasy - она позволяет мокать методы класса, но только открытые. В faked-объекте закрытые методы даже через Reflection не находятся.

    16 ноября 2016 г. 8:27
  • Закрытая часть тестируется через открытую. Т.е. если у вас требование, например по тендеру, покрытия тестами не менее чем на 75%, то подменять закрытый метод вам нельзя, а нужно подменять те методы внешних классов которые он использует. В вашем примере это работа с FileStream.
    16 ноября 2016 г. 8:30
    Отвечающий
  • Хорошо, но вопрос остался открытым - как подключить к студии MS Fakes?


    16 ноября 2016 г. 8:47
  • Какая редакция Visual Studio у вас: Community, Professional, Enterprise? Не во всех она поддерживается.

    "Нужно покрытие проекта тестами в 75 % :) ТЗ такое." - а почему не 200% или 300%, нужно бить по рукам того, кто пишет такие ТЗ.


    Сделаем содержимое сообщества лучше, вместе!

    16 ноября 2016 г. 9:15
    Модератор
  • Спасибо. У меня Professional, а Fakes есть только в Enterprise. Ну ладно. Закрываю тему.
    16 ноября 2016 г. 10:11