[英]Spec Explorer - Abstract specification of behaviour
我目前正在評估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);
類的后置條件來指定它elements.contains(\\result);
。 這可能嗎?
顯式定義的問題是我將強制執行選擇策略。
我嘗試通過以下方式避免此問題(也許我只是缺少了一些小東西,有人可以給我提示正確執行此操作):
doSomething
添加參數ModelElement e
Condition.IsTrue(elements.Contains(e))
到doSomething
SelectElement
定義一個動作 在配置腳本中定義機器SelectAndDo
,如下所示:
machine SelectAndDo() : Main { let ImplementationElement e Where {.Condition.IsTrue(e.Equals(SelectElement()));.} in doSomething(e) }
SelectAndDo
代替doSomething
但是,這不起作用,因為對相應模型的探索進入了錯誤狀態。 如果這根本不起作用,那么Windows上是否有比Spec Explorer更好的替代品,最好是穩定的? 可以推薦使用FsCheck來測試有狀態系統嗎?
我發現了問題所在。 上面概述的解決方案實際上是SelectElement()
,但是如果元素為空,則我從SelectElement()
返回null
,因此無法滿足where子句中的條件。 因此,我決定不返回null,而是返回類似於Null Object的“非法”元素。 所以我的整個解決方案看起來像這樣:
機器:
machine Full() : Main
{
Init(); CreateElement();CreateOtherElement();CreateIllegal(); SelectAndDo* || ModelProgram
}
需要CreateIllegal()
,以便SelectAndDo
中的條件。
除此之外,我還在模型程序中添加了對該非法值的檢查。
編輯:
實際上,使用Choice.Some<T>
有一種更好的,直接的方法,我不知道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.