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, и представлен неизменяемым типом записи.