Написать unit тест с заглушками на любой из методов

244
01 февраля 2018, 15:31

Необходимо написать unit тест с заглушками на любой из методов.

using System;
namespace Cinema
{
    class Program
    {
        static void Main(string[] args)
        {
            Playbill playbill = new Playbill();
            // 1. Вывод сеансов
            playbill.PrintMovies();
            // 2. Ввод пользователем сеанса
            DateTime dt;
            Console.WriteLine("Введите дату:");
            if (!DateTime.TryParse(Console.ReadLine(), out dt))
            {
                Console.WriteLine("Не верный формат даты. Нажмите что-нибудь для выхода...");
                Console.ReadKey(true);
                return;
            }
            Console.WriteLine("Введите название фильма:");
            string filmname = Console.ReadLine();
            Movie mov;
            if ((mov = playbill.SearchMovie(dt, filmname)) == null)
            {
            }
            // 3.1 Вывод свободных мест в кинозале
            mov.PrintFreePlaces();
            int answ;
            // 3.2 Выбор места
            Console.WriteLine("Количество билетов: ");
            if (!Int32.TryParse(Console.ReadLine(), out answ))
            {
                Console.WriteLine("Не верный формат данных. Нажмите что-нибудь для выхода...");
                Console.ReadKey(true);
                return;
            }
            Console.ReadKey(true);
        }
    }
    // стуктруа "Место"
    struct Place
    {
        public int row;// ряд
        public int place_number;// номер сиденья
        public Place(int r, int p)
        {
            row = r;
            place_number = p;
        }
    }
    // класс "Сеанс"
    class Movie
    {
        public readonly DateTime datetime;// дата сеанса
        public readonly string name;
        public readonly int price;
        public readonly string genre;
        public readonly TimeSpan duration;// продолжительность сеанса
        public Place[] free_places;
        public int free_pl_count;// кол-во свободных мест
        private static readonly int fr_pl_MAX_cnt = 100;
        private static readonly int rows_MAX_cnt = 10;
        private static Random random = new Random(DateTime.Now.Millisecond);
        public Movie(DateTime datetime, string name, int price, string genre, TimeSpan duration)
        {
            this.datetime = datetime;
            this.name = name;
            this.price = price;
            this.genre = genre;
            this.duration = duration;
            free_pl_count = random.Next(1, fr_pl_MAX_cnt);
            GenerateFreePlaces();
        }
        private void GenerateFreePlaces()
        {
            // рандомное генерирование свободных мест
            free_places = new Place[random.Next(1, rows_MAX_cnt)];
            for (int i = 0; i < free_places.Length; i++)
                free_places[i] = new Place(random.Next(0, rows_MAX_cnt), random.Next(0, fr_pl_MAX_cnt));
        }
        public bool CheckForPlace(int row, int pnumber)
        {
            foreach (Place p in free_places)
                if (row == p.row && pnumber == p.place_number)
                    return true;
            return false;
        }
        public void PrintFreePlaces()
        {
            Console.WriteLine("Количество свободных мест | Ряд | Места");
            Console.WriteLine(free_pl_count);
            foreach (Place p in free_places)
                Console.WriteLine("\t\t\t     {0}\t  {1}", p.row, p.place_number);
        }
    }
    // класс "Киноафиша"
    class Playbill
    {
        public Movie[] movies;
        public Playbill()
        {
            movies = new Movie[3];
            movies[0] = new Movie(new DateTime(2018, 01, 12, 14, 00, 00), "Матрица", 19, "Фантастика", new TimeSpan(2, 0, 0));
            movies[1] = new Movie(new DateTime(2018, 01, 15, 19, 00, 00), "Елеки", 13, "Фантастика", new TimeSpan(1, 0, 0));
            movies[2] = new Movie(new DateTime(2018, 01, 24, 09, 00, 00), "Небо", 11, "Фантастика", new TimeSpan(1, 30, 0));
        }
        public Movie SearchMovie(DateTime date, string name)
        {
            // поиск сеанса с заданной датой и названием
            foreach (Movie m in movies)
                if (m.datetime.Date == date && m.name == name)
                    return m;
                else
                    continue;
            return null;
        }
        public void PrintMovies()
        {
            Console.WriteLine("  Дата\t  |\tВремя | Название фильма | Стоимость билета |\t Жанр\t   | Время сеанса");
            foreach (Movie m in movies)
                Console.WriteLine("{0}\t{1:d2}:{2:d2}\t{3}\t\t\t{4}р.\t\t{5}\t{6} мин.", m.datetime.Date.ToShortDateString(),
                                       m.datetime.Hour, m.datetime.Minute, m.name, m.price, m.genre, m.duration.TotalMinutes);
        }
    }
}
Answer 1

Вот вам для раскачки, начало тестирования класса Movie

[TestClass()]
public class MovieTests
{
    private Movie _movie;
    [TestInitialize]
    public void Initialization()
    {
        DateTime datetime = new DateTime(year: 2018, month: 1, day: 28, hour: 13, minute: 15, second: 0);
        string name = "Операция Ы";
        int price = 300;
        string genre = "Комедия";
        TimeSpan duration = TimeSpan.FromMinutes(120);
        _movie = new Movie(datetime, name, price, genre, duration);
    }
    [TestMethod()]
    public void MovieTest()
    {
        //Arrange
        int year = 2018;
        int month = 1;
        int day = 28;
        int hour = 13;
        int minute = 15;
        int second = 0;
        DateTime datetime = new DateTime(year, month, day, hour, minute, second);
        string name = "Операция Ы";
        int price = 300;
        string genre = "Комедия";
        int minutes = 120;
        TimeSpan duration = TimeSpan.FromMinutes(minutes);
        //Act
        Movie movie = new Movie(datetime, name, price, genre, duration);
        //Assert
        Assert.IsNotNull(movie);
        Assert.AreEqual(name, movie.name);
        Assert.AreEqual(datetime, movie.datetime);
        Assert.AreEqual(price, movie.price);
        Assert.AreEqual(genre, movie.genre);
        Assert.AreEqual(duration, movie.duration);
        Assert.IsTrue(movie.free_places.Length > 0);
        Assert.IsTrue(movie.free_pl_count > 0);
    }
    [TestMethod()]
    public void CheckForPlaceTest()
    {
        //Arrange
        Place place = _movie.free_places.First();
        int row = place.row;
        int pnumber = place.place_number;
        //Act
        bool result = _movie.CheckForPlace(row, pnumber);
        //Assert
        Assert.IsTrue(result);
    }

Ну, и пару замечаний... Всякий публичный метод (конструктор) имеющий параметры должен их проверять на допустимые значения перед их дальнейшем использованием; у вас конструктор позволяет создать фильм с пустыми значениями name, genre, c нулевым значением цены и проч. лабуда, такого быть не должно. Объект имеет право на существование только при валидных значениях своих данных. Надо делать проверку

if (price == 0) throw new ArgumentException("Цена не может быть равной нулю!");
if (String.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));

и так далее.

На такие условия тоже нужно писать тесты

    [TestMethod]
    [ExpectedException(typeof(ArgumentException))]
    public void MovieWithWrongPriceThrowException()
    {
        //Arrange
        int year = 2018;
        int month = 1;
        int day = 28;
        int hour = 13;
        int minute = 15;
        int second = 0;
        DateTime datetime = new DateTime(year, month, day, hour, minute, second);
        string name = "Операция Ы";
        int price = 0;
        string genre = "Комедия";
        int minutes = 120;
        TimeSpan duration = TimeSpan.FromMinutes(minutes);
        //Act
        try
        {
            Movie movie = new Movie(datetime, name, price, genre, duration);
        }
        catch (ArgumentException ex)
        {
            //Assert
            Assert.AreEqual("Цена не может быть равной нулю!", ex.Message);
            throw;
        }
    }
READ ALSO
Как отформатировать строку средствами c#

Как отформатировать строку средствами c#

ребята, получил SelectSingleNode в переменную типа string вот в таком виде

204
Методы класса Parallel

Методы класса Parallel

Рихтер пишет:

243
Как добавить окончание .html к URL-адресу ASP.NET MVC 5?

Как добавить окончание .html к URL-адресу ASP.NET MVC 5?

Нужно добавить окончаниеhtml для URL-адресов в ASP

194