FsCheck. Разница между объектом и моделью

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

В результате я нашел 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;
        }
    }
}

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


ошибка:
Код

if (!_isOnOrderList)
{
    return;
}

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


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

UPD:

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам