Необходимо написать 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);
}
}
}
Вот вам для раскачки, начало тестирования класса 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;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
ребята, получил SelectSingleNode в переменную типа string вот в таком виде
Нужно добавить окончаниеhtml для URL-адресов в ASP