簡體   English   中英

Spec Explorer-行為的抽象規范

[英]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); 這可能嗎?

顯式定義的問題是我將強制執行選擇策略。

我嘗試通過以下方式避免此問題(也許我只是缺少了一些小東西,有人可以給我提示正確執行此操作):

  1. doSomething添加參數ModelElement e
  2. 將條件Condition.IsTrue(elements.Contains(e))doSomething
  3. 在配置腳本SelectElement定義一個動作
  4. 在配置腳本中定義機器SelectAndDo ,如下所示:

     machine SelectAndDo() : Main { let ImplementationElement e Where {.Condition.IsTrue(e.Equals(SelectElement()));.} in doSomething(e) } 
  5. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM