我目前正在评估Spec Explorer,但我遇到了有关函数行为的抽象规范的问题。 我有类似的东西:
[TypeBinding("Implementation.ImplementationElement")]
public class ModelElement
{ /*... */ }
public class ModelBehaviour
{
[Rule]
public static void doSomething()
{
ModelElement sel = SelectElement(elements);
// ... do something with sel
}
private static Set<ModelElement> elements = new Set<ModelElement>();
}
现在我不想在模型程序中明确定义SelectElement(Set<ModelElement> e)
。我更愿意使用像elements.contains(\result);
这样的后置条件来指定它。这有可能吗?
明确定义的问题是我会强制执行选择策略。
我试图通过以下方式避免这个问题(也许我只是错过了一些小的东西,有人可以给我一个正确的提示):
ModelElement e
添加到doSomething
Condition.IsTrue(elements.Contains(e))
添加到doSomething
SelectElement
在config-Script中定义一台机器SelectAndDo
,如下所示:
machine SelectAndDo() : Main
{
let ImplementationElement e
Where {.Condition.IsTrue(e.Equals(SelectElement()));.}
in doSomething(e)
}
SelectAndDo
代替doSomething
然而,这不起作用,因为对相应模型的探索进入错误状态。 如果这根本不起作用,那么Windows上的Spec Explorer是否有一个很好的替代方案,最好是稳定的?可以推荐FsCheck来测试有状态系统吗?
答案 0 :(得分:0)
我弄清楚问题是什么。
上面描述的解决方案实际上工作,但是如果元素为空,我从null
返回SelectElement()
,因此无法满足where子句中的条件。因此,我决定返回一个“非法”元素,而不是返回null,类似于Null对象。
所以我的整个解决方案看起来像这样:
机器:
machine Full() : Main
{
Init(); CreateElement();CreateOtherElement();CreateIllegal(); SelectAndDo* || ModelProgram
}
CreateIllegal()
需要afaik,以便SelectAndDo
中的条件可以实现。
除此之外,我在模型程序中添加了对此非法值的检查。
修改强>
使用Choice.Some<T>
实际上有一种更好,更直接的方式,我不知道。