Тестирующая система по отдельным вопросам проектирования windows form

Сделать тест на windows forms

Создать тест знаний внутри проекта Windows Forms
Всем добра! Люди, помогите, в долгу не останусь, есть черновая программка для курсовой, нужно.

Как сделать скролл в Windows Forms?
Как в с++ windows forms сделать в форме скролл, который бы действительно прокручивал форму вниз.

Как сделать привилегии в windows forms
Не могу понять как сделать для каждого пользователя свою привилегию. Допустим есть окно.

Давид Монтиков, отвратительно поставленный вопрос!
варианты ответов (под стать вопросу):
1) руками
2) запрограммировать
3) легко!

выбирай любой.
задавай конкретные вопросы! «как готовить еду?» и «сколько воды надо на 200 грамм риса, чтобы он получился рассыпчатым?» — это, согласись, абсолютно разный подход.

а ну раз так, то вот:
1) код нужен на C# (раз уж ты в этом разделе пишешь)
2) использовать нужно либо файлы (подозреваю, что лучше всего использовать бинарную сериализацию — ответы на вопросы выцепить будет чуть-чуть сложнее тем, кто решит ломануть), либо БД (хватит и MS Access в случае чего)
3) в самом примитивном варианте на форме будут нужны:
— 1 лейбл (сам вопрос)
— 1 кнопка (для подтверждения ответа, но можно обойтись и без нее)
— несколько радиобаттонов (по числу вариантов ответа на каждый вопрос)

а дальше — пока у тебя не будет конкретных вопросов (причем не из серии «как мне использовать лейбл», «какой код забивать в кнопку» и т.п., а нормальных вопросов, в которых ты покажешь что сам сделал хоть что-нибудь) — вряд ли кто-нибудь тебе будет помогать.

Ответы на 7 самых частых вопросов по WinForms

Ответы на 7 самых частых вопроса по WinForms

1. Как создать вторую форму
Любая форма представляет из себя класс, унаследованный от Form.
Экземпляр главной формы создается в файле Program.cs по умолчанию.

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

2. Как передать данные из одной формы в другую
Часто возникает необходимость передать данные из одной формы в другую, я придумал 7 способов, у каждого свои недостатки и достоинства.
2.1 Изменение модификатора доступа (добавлено 24 июля 2017: лучше воздержаться от применения данного способа)
В Form2 Установить модификатор доступа для контрола/поля public
В любом месте Form1

+ Самый быстрый в реализации и удобный способ
— Противоречит всем основам ООП
— Возможна передача только из более поздней формы в более раннюю
— Форма f показывается только с использованием ShowDialog(), т.е. в первую форму управление вернется только по закрытию второй. Избежать этого можно, сохранив ссылку на вторую форму в поле первой формы

2.2 Использование открытого свойства/метода. Способ очень похож на первый
В классе Form2 определяем свойство (или метод)

+ Противоречит не всем основам ООП
— Минусы те же

2.3 Передача данных в конструктор Form2
Изменяем конструктор Form2

+ Простой в реализации способ
+ Не нарушает ООП
— Возможна передача только из более ранней формы в более позднюю

2.4 Передача ссылки в конструктор
Изменяем конструктор Form2

+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
— Нарушает ООП

2.5 Используем свойство ‘родитель’
При создании второй формы устанавливаем владельца

+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
+ Не нарушает ООП

2.6 Используем отдельный класс
Создаем отдельный класс, лучше статический, в основном namespace, т.е. например в файле Program.cs

+ Самый удобный способ, когда данные активно используются несколькими формами.

2.7 Использование функций обратного вызова
2.7.1 Передача метода в конструктор
Создаем в основном namespace делегат

Непонятен пункт 2.5 из «Ответы на 7 самых частых вопросов по WinForms»
Вопрос по пункту 2.5 из «Ответы на 7 самых частых вопроса по WinForms». Вот код: // в форме 1.

Ответы на 7 самых частых вопросов по Windows Forms, C++/CLI Edition
Ответы на 7 самых частых вопросов по Windows Forms C++/CLI Edition Эта статья является.

Ответы на 7 самых частых вопросов по Windows Forms, C++/CLI Edition — свой способ передачи данных между формами
Способ с использованием макросов. Средней сложности в реализации и понимании, не знаю, нарушает ли.

Читайте также:  Windows 10 сервис телеметрии

Список Ваших вопросов Платону Щукину и его ответы
Данная тема будет предназначана для публикования Ваших вопросов и ответов с службой поддержки.

+ Наиболее гибкий способ передачи данных
— Сложен в реализации и понимании

3. Как получить доступ к контролу из другого потока
С элементами управления можно работать только из того потока в котором они были созданы. При обращении из другого потока будет сгенерировано исключение InvalidOperationException с текстом «Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on.» (Недопустимая операция в нескольких потоках: попытка доступа к элементу управления не из того потока, в котором он был создан.). Возможные решения:

3.1 Простой и неправильный способ
Отменяем проверку, из какого потока используется контрол

Для одного раза может и сработать, но делать так крайне не рекомендуется.

3.2 Использование методов Invoke/BeginInvoke
Эти методы выполняют указанные делегаты в том потоке, в котором контрол был создан.
Invoke вызывает делегат синхронно, BeginInvoke — асинхронно.
Чтобы определить, требуется ли Invoke используйте свойство InvokeRequired.
Например, объявляем делегат

Позволю себе дополнить вопрос по связи и передаче данных двух форм, формы и класса. Подобные темы возникают очень часто, но в данном FAQ нет главного примера — использование событий, которые, как я считаю, являются самым верным способом для передачи к-либо данных.
Итак, вот участки кода. Для лучшего понимания прикрепляю архив с проектом. Имеем:
1.Главная форма, с двумя датагридами и двумя кнопками.
2.Дополнительная форма с тремя текстовыми полями и одной кнопкой.
3.Отдельный класс.
Логика работы: по нажатию на кнопку получения данных из доп.формы, открывается окно второй формы. Заполняем текстовые поля, и по нажатию кнопки форма закрывается, а данные из полей оказываются в гриде 1. По нажатию кнопки получения данных из класса создается объект класса, в конструкторе класса формируется таблица, которая при вызове метода класса передает данные в осн. форму, где они отображаются в гриде 2.
Также уточню, что передачу таблиц я выбрал для наглядности, и передавать таким способом можно все что угодно, используя приведенный шаблон
PS.В моем коде специально не использовались анонимные делегаты и лямбда, для облегчения восприятия новичками.

Код основной формы:

Вложения

FormsCommunicatoinTest.rar (51.7 Кб, 1461 просмотров)
24.08.2015, 08:37 Ответы на 7 самых частых вопросов по WinForms
Комментарий модератора
Если вы нашли неточность или опечатку, хотите что-то добавить к написанному в статье — обсуждение ведётся в отдельной теме:
https://www.cyberforum.ru/faq/thread1519017.html
Меню пользователя @ tezaurismosis
Читать блог

Найти вероятность того, что студент, выбирая ответы наугад, ответит на 10 вопросов
Машина-экзаменатор содержит 12 вопросов, на каждый из которых предлагается 4 варианта ответа.

Ответы на Комплект вопросов сертиф экз «1С:Бухгалтерия 8» ред. 1.6
У кого есть ответы на «Комплект вопросов сертифицированного экзамена по программе «1С:Бухгалтерия.

на ответы@mail.ru на один из моих вопросов, где я уточнил, что использую ubuntu 10.10 мне сказали, что.
на ответы@mail.ru на один из моих вопросов, где я уточнил, что использую ubuntu 10.10 мне сказали.

Найти два самых больших и самых маленьких элементов массива
Одномерные массивы для обычных массивов и для класса Array. Составить программу нахождения двух.

Модульное тестирование Windows forms C#

подскажите есть ли возможность произвести модульное тестирование приложений на основе Windows Forms? Не нашла в интернете какой — то определенности для себя. Смотрела туториалы по модульному тестированию, как только дошла до вызова класса — встряла. При вызове класса Form, он не отображается, выходит ошибка о том, что данный класс не существует, хотя ссылку на проект в тесте, который необходимо тестировать я добавляла.

2 ответа 2

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

Работать будем с уклоном в TDD (Test driven development или «Разработка на основе тестирования»). Создадим решение с проектом, набросаем интерфейс программы.

Добавьте в решение проект библиотеки

Добавьте в решение тестовый проект xUnit

Добавьте ссылки на проект библиотеки в тестовый и WinForms проекты

Создайте в проекте библиотеки класс MainFormViewModel для главного окна нашей программы.

В проекте тестов переименуйте UnitTest1 в MainFormViewModelTests и добавьте using Rectangle.Core; . Напишите пару таких тестов

Т.к. в классе не было создано соотв. свойств, то действуйте так

  1. Теперь запустите тесты

и. тесты не прошли. Это нормально так и должно быть. Исправьте класс так

Добавьте еще два теста

и два соответствующих метода в класс въюмодели. Тесты не пройдут. Подправьте так методы

Убедитесь, что тесты теперь проходят. Далее реализуете методы уже так, чтобы они действительно вычисляли нужные данные и проверяете, что все тесты проходят. Далее будет по принципу «Как нарисовать сову»

Вот такие тесты

К такому тестируему классу

Теперь используем класс въюмодели так

Всё! Ссылка на этот пример здесь.

Обычно новички в программировании слабо различают такую вещь, как слои приложения и часто смешивают воедино бизнес-логику и визуальное представление. Такой код сложнее и в поддержке, рефакторинге и в тестировании.

Типичный пример — в обработчик клика на кнопку помещают логику (открывают соединение с FTP-сервером, производят сложные расчёты и т.п.), можете просто посмотреть сами.

На примере приложения-калькулятора: вы можете нафигачить код прямо в своё winforms-приложение, но если вы выделите класс калькулятора без привязки ко всем этим object sender, EventArgs e то ваш код можно будет весьма просто тестировать, а потом этот протестированный класс калькулятора многократно использовать — хоть в консольном приложении, хоть в winforms, хоть в WPF или веб-приложении asp.net mvc.

А потому, пока у вас вообще нет никаких тестов — начните с простых модульных тестов без всякой привязки к (интеграционному) тестированию UI-интерфейса winforms. А для этого вам нужно будет отделить логику от представления.

Кратко и сжато как тестировать код есть например здесь: Как писать юнит тесты?

Можете в отдельные проекты не выносить, но убрать зависимость от классов winforms — важно.

Как перевести понятия MVP/MVC в термины WinForms?

В описании паттерна MVP (Model-View-Presenter) сказано следующее:

  • Model (Модель) — предоставляет данные для пользовательского интерфейса.
  • View (Представление) — реализует отображение данных (Модели) и маршрутизацию пользовательских команд или событий Presenter-у.
  • Presenter — управляет Моделью и Представлением. Например извлекает данные из Модели и форматирует их для отображения в Представлении.

Что в WinForms приложениях соответствует View и Presenter?

3 ответа 3

Стандартная лапша — в code-behind форм в обработчиках событий производится запросы к модели, какая-то работа и визуализация результата.

В mvp модель остается моделью, то есть это набор бизнес-логики, а код в форме делится на View и Presenter

View — это формы, code-behind этих форм, где производится работа по визуальной составляющей, а также туда же сводятся подписки на события контролов

Presenter — туда вынесен рабочий код, который не являются частью визуализации. View содержит ссылку на presenter и вызывает его методы. А presenter содержит ссылку на View через интерфейс

То есть View в обработчиках событий контролов делегирует presenter-у «сделай это», а presenter содержит управляющий код, который опросит модель, получит результат и потом дернет View и скажет ему «отрисуй такое то»

Таким образом визуализирующий и управляющий код разделяются.

По просьбе @Stack привожу пример. Псевдошарпокод.

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

Далее интерфейс представления

и представление winforms

для WPF код в общем то идентичен Winforms кроме класса родителя и сигнатур обработчиков событий (хотя лучше все таки MVVM)

за IMainView может быть скрыто что-угодно — от простой формы winforms до самописной системы отрисовки на удаленной машине.

  1. «Логика интерфейса» по факту делится на «презентационную логику» и собственно «логику визуализации». В «презентационную логику» входит решение, что делать по нажатию на кнопку и что делать с результатом — по сигналу от UI работает с моделью и просит потом «логику визуализации» отобразить результат. В «логику визуализации» входит отображение того, что просят — контролы, события, установки полей у контролов, кобминирование контролов и так далее.
  2. Презентер не имеет прямой ссылки на представление, поэтому детали отображения на UI инкапсулированы (опять же чистота кода, вся сложность спрятана) и возможность заменять представление на другое.
  3. Презентер не имеет прямой ссылки на представление, а значит вместо представлениям можно подсунуть заглушку и протестировать презентер. Тестировать же логику интерфейса без такого разделения крайне сложно (нужно тыкать мышью руками или автоматикой и считывать как то результаты с экрана)

Решил добавить еще один ответ, потому что размер комментариев ограничен, а у @Stack все перемешалось в голове и мой пост отвечает не на вопрос «как», а на «где и почему?»

Цель MVP не сделать возможность подмены UI (для этого просто нужно менять UI), а разделить ответственности и обеспечить тестируемость.

Допустим нам нужно написать приложение под разные абстрактные платформы.

у нас разные UI на разных платформах.

  • Делаем проект-ядро, где будет логика приложения и создаем по проекту UI на каждую платформу и при компиляции оно разберется
  • Делаем UI на кроссплатформенных контролах

прячем за фасадом (паттерн такой) любые реализации UI приводя их к обобщенному виду фасада. Банально делается класс/интерфейс за которым прячется реальный UI. но это не MVP, а просто сокрытие сложности и зависимостей

Для подобной же цели служит паттерн «мост». Отличие от варианта с «фасадом», что, вместо сокрытия реализации за фасадом, более ярко выражена связующая шина между приложением и графическим приложением и независимость реализации обоих частей

А где же MVP?

Когда задача подмены UI решена, то нужно реализовать эти самые UI.

Допустим одна из наших UI на WinForms. В силу особенностей Visual Studio мы получаем на выходе в Code-Behind основной формы кучу методов (евент-хендлеры и кучу приватных методов реализующих логику интерфейса). Мало того, что это лапша кода, так еще все это невозможно тестировать — для тестирования нужно тыкать на кнопки и отслеживать изменение GUI, что сложно.

Возникает желание навести порядок. Это можно сделать 101 способом (MVC/MVP/MVVM/MVVMC/свой вариант), просто некоторые в конкретном случае будут менее удобны чем другие, а ведь еще хочется не терять визуальный дизайнер студии. И паттерн MVP хорошо подходит для UI, где нет нормальных биндингов, потому что прост и прячет кучу визуализационного кода за интерфейсом. Это и Winforms, и я вот под андроид тоже использую MVP.

вообще то это очевидное решение — разделить godobject на классы и удалить зависимости от реализаций, спрятав за интерфейсами. Типичные варианты решений и обозвали паттернами

Разделив визуализацию и логику мы получаем возможность тестировать ту логику, что вошла в презентер (а туда входит вся управляющая логика взаимодействия с моделью и управления визуализацией). Тестировать просто, ведь презентер просто класс с зависимостями. Если же еще хочется тестировать кнопочки, то winium в руки, но тестировать UI всегда сложно

«как в вашем примере тестировать Presenter. из-за new в методе LoadPlanets() < var planets=new PlanetReader(). >его невозможно тестировать отдельно от конкретной модели» @Stack

Для этого используется то, что называется «принцип инверсии зависимостей». Еще одно очевидное решение, имеющее свое название

Делаем интерфейс IPlanetReader и выносим его в конструктор. Или же используем ServiceLocator. Или же IoC-контейнеры. Или любой другой вариант. MVP всего лишь вариант разделения на ответственности «где за что отвечает», а реализация ответственностей уже не входит в него и там полная свобода действий

тестирование UI это проверка того как смотрятся шрифты -это вообще тестируется только глазами. мы же говорим про автоматическое тестирование.

Тестирование через эмуляцию нажатий кнопок и считыванием информации с контролов. недостатки: сложность считывания даннных (мало ли какие контролы), сложность изоляции (для проверки, что пользователь существует нам нужно подсунуь базу где пользователь есть), скорость работы (из-за того, что полностью работают все слои приложения). Не выявляет функциональные ошибки, когда делает не то, но показывает правильный результат.

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

Лично мне куда проще тестировать презентер (он выявляет функциональные ошибки и за них мне по шапке дают), а кривизна дизайна не фатальна (вся логика в презентере, в представлении логики практически нет и сломать его сложнее, а вреда от этого минимум).

Читайте также:  Стекло защитное толстое protective windows d37 t7 6kw
Оцените статью