Модульное тестирование выигрышной формы метод проверки - PullRequest
0 голосов
/ 21 сентября 2018

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

Проблема у меня?не сделал MVC правильно или я что то пропустил?

Вот мой метод, который я пытаюсь проверить, и фактический модульный тест:

private static bool ValidRange(TextBox tb)
        {
            float x = float.Parse(tb.Text.Split(',')[0]);
            float y = float.Parse(tb.Text.Split(',')[1]);

            if ((x < 10 || x > 1000) || (y < 10 || y > 730))
            {
                return false;
            }
            return true;
        }

public static bool CoordinateValidation(Panel pointsPanel, ErrorProvider errorProvider)
        {
            bool status = true;
            Regex regex = new Regex(@"^((\d+\.?\d*),{1}(\d+\.?\d*))$");

            foreach (TextBox tb in pointsPanel.Controls)
            {
                Match match = regex.Match(tb.Text);

                if (!match.Success)
                {
                    errorProvider.SetError(tb, "Invalid coordinates!");
                    status = false;
                }

                else if (!ValidRange(tb))
                {
                    errorProvider.SetError(tb, "Invalid range!");
                    status = false;
                }

                else
                {
                    errorProvider.SetError(tb, "");
                }
            }
            return status;
        }

namespace BezierLibrary.UnitTests
{
    [TestClass]
    public class BezierHelperTests
    {
        [TestMethod]
        public void CoordinateValidation_InvalidCoordinate_ReturnFalse()
        {
            //Arrange
            var panel = new Panel();
            var textbox = new TextBox();
            var errorProvider = new ErrorProvider();
            panel.Controls.Add(textbox);
            textbox.Text = "5";

            //Act
            var result = BezierHelper.CoordinateValidation(panel, errorProvider);

            //Assert
            Assert.IsFalse(result);

        }
    }
}

1 Ответ

0 голосов
/ 21 сентября 2018

Как сказал Лешек Репи в своем комментарии, вы не должны проходить контроль.Никогда не смешивайте уровень представления (отображение / элементы управления) с бизнес-уровнем (вычисления).Поэтому, когда пользователь нажимает кнопку «ОК», в вашем обработчике OkButtonClick вы извлекаете текст из текстового поля.Затем этот текст передается в качестве параметра для ваших бизнес-функций.Это также имеет то преимущество, что упрощает ваши модульные тесты - вы просто жестко кодируете строку теста.

Рассмотрите возможность использования функций этой формы:

bool CoordinateValidation(String coordinates, ref String errorMessage    )

bool ValidRange( String coordinates )

Когда вы получите эту работу, обратите свое внимание на CoordinateValidation ().Он выполняет некоторую собственную проверку (проверяет координаты), затем вызывает ValidateRange ().Я предлагаю извлечь проверку координат и поместить этот код в новую функцию.Затем ваша функция CoordinateValidation просто вызывает вашу новую функцию и ValidateRange ().

Надеюсь, что это поможет.

Правка - Вот небольшой пример:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click( object sender, EventArgs e )
        {
            List<DataTransferObject> dtos = new List<DataTransferObject>();
            dtos.Add( new DataTransferObject() { Field = FieldId.FieldA, Text = textBox1.Text } );
            dtos.Add( new DataTransferObject() { Field = FieldId.FieldB, Text = textBox2.Text } );

            BusinessThing businessThing = new BusinessThing();
            businessThing.Validate( dtos );

            foreach( var dto in dtos )
            {
                if( dto.Error != null )
                {
                    if( dto.Field == FieldId.FieldA )
                    {
                        label1.Text = dto.Error;
                    }
                    // etc
                }
            }
        }
    }

    public enum FieldId
    {
        FieldA,
        FieldB
    }

    public class DataTransferObject
    {
        public FieldId Field { get; set; }
        public String Text { get; set; }
        public String Error { get; set; } = null;
    }

    public class BusinessThing
    {
        private Regex regex = new Regex(@"^((\d+\.?\d*),{1}(\d+\.?\d*))$");

        public void Validate( List<DataTransferObject> dtos )
        {
            foreach( var dto in dtos )
            {
                Validate( dto );
            }
        }

        public void Validate( DataTransferObject dto )
        {
            if( ValidateCoordonate( dto ) )
            {
                ValidateRange( dto );
            }
        }

        public Boolean ValidateCoordonate( DataTransferObject dto )
        {
            Match match = regex.Match(dto.Text);

            if( match.Success )
            {
                return true;
            }
            else
            {
                dto.Error = "Invalid coordinates!";
                return false;
            }
        }


        public Boolean ValidateRange( DataTransferObject dto )
        {
            float x = float.Parse(dto.Text.Split(',')[0]);
            float y = float.Parse(dto.Text.Split(',')[1]);

            if( (x < 10 || x > 1000) || (y < 10 || y > 730) )
            {
                dto.Error = "Invalid range!";
                return false;
            }
            return true;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...