FsCheck.Разница между объектом и моделью - PullRequest
0 голосов
/ 23 мая 2018

Я недавно слышал о тестировании на основе моделей и искал инструменты, которые могут следовать этому подходу.

В результате я нашел FsCheck .

На Экспериментальная страница, автор описывает, как создать тест на основе модели, который может быть выполнен.

Это все хорошо и все, но, к сожалению, я не понимаю, в чем будет разница между фактическим объектоми модель объекта.

Итак, учитывая следующий код:

using System;
using System.Collections.Generic;
using System.Text;

namespace SimpleOrderApp
{
    public class Order
    {
        private string _name;
        private string _description;
        private bool _isOnOrderList;

        public Order(string name, string description)
        {
            _name = name;
            _description = description;
            _isOnOrderList = false;
        }

        public string Name { 
            get => _name;
            set 
            {
                if (!_isOnOrderList)
                {
                    return;
                }
                _name = value;
            }
        }

        public string Description
        {
            get => _description;
            set 
            {
                if (!_isOnOrderList)
                {
                    return;
                }

                _description = value;
            }
    }

        public bool IsOnOrderList
        {
            get => _isOnOrderList;
            set => _isOnOrderList = value;
        }
    }
}

Спецификация: - Пользователь может предоставить название заказа - Пользователь может предоставитьописание заказа - Пользователь не может обновить заказ, если он находится в OrderList (IsOnOrderList = true)


Ошибка:
Код

if (!_isOnOrderList)
{
    return;
}

Не должен иметь!.


Может ли кто-нибудь помочь мне сконструировать OrderModel, который я могу использовать для проверки моего Order объекта и объяснить мне, почему это нужно сделать?В настоящее время я очень хочу думать, что Order и OrderModel идентичны.

UPD:

Было бы правильно утверждать, что Модель имеет те же свойства тестируемого объекта, а значения просто жестко закодированы?

1 Ответ

0 голосов
/ 24 мая 2018

Модель, как правило, является неизменным значением и проще, чем тестируемая система (SUT).Обычно для тестов на основе моделей SUT на самом деле представляет собой систему, то есть набор взаимосвязанных классов, которые делают что-то нетривиальное, содержат несколько структур данных и т. Д., Или это довольно сложный класс, например, класс, который реализует конкретную структуру данных,как B-дерево или параллельная очередь.Поэтому найти что-то более простое, которое не моделирует точно все, что происходит в SUT, или делает это очень наивно или неэффективно, довольно просто.

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

Может помочь немного более сложный пример, здесь есть источник в FsCheck: https://github.com/fscheck/FsCheck/blob/master/src/FsCheck/Script.fsx#L22 В этом коде вы можете видеть, что класс модели намного короче, чем SUT, и представлен неизменяемым типом записи.

...