FsCheck。对象和模型之间的区别

FsCheck. Difference between the object and the model

我最近听说了基于模型的测试并搜索了可以遵循这种方法的工具。

结果我发现 FsCheck

Experimental 页面上,作者描述了如何创建可以执行的基于模型的测试。

一切都很好,但遗憾的是我不明白实际对象和对象模型之间有什么区别。

所以,给定以下代码:

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 对象并向我解释为什么必须这样做吗?目前,我非常热衷于认为 OrderOrderModel 是相同的。

更新:

声明模型具有与被测对象相同的属性但值只是硬编码是否正确?

模型通常是一个不可变的值,并且比被测系统 (SUT) 更简单。通常对于基于模型的测试,SUT 实际上是一个系统,即一组相互关联的 classes 做一些重要的事情,包含多个数据结构等,或者它是一个非常复杂的 class,例如class 实现特定数据结构,如 B 树或并发队列。因此,找到一些更简单的东西,而不是完全模拟 SUT 中发生的一切,或者以非常幼稚或低效的方式模拟,是非常简单的。

很难在入门示例中展示这种示例,因为您很快就会迷失在细节中。对于您提供的示例,您可以用 3 元组(名称、描述、isOnOrderList)表示您的 class 并从那里开始。然后操作将是 setName、setDescription、setIsOnOrderList。但是由于您的起始示例本身非常简单,因此在这种情况下要找到更简单的东西来测试实质性内容并不容易。

一个稍微更详细的例子可能会有帮助,这里的 FsCheck 源代码中有:https://github.com/fscheck/FsCheck/blob/master/src/FsCheck/Script.fsx#L22 在该代码中,您可以看到模型 class 比 SUT 短得多,并且由不可变记录类型表示。