0

現在、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);ます。これはどういうわけか可能ですか?

明示的な定義の問題は、選択戦略を強制することです。

私は次の方法で問題を回避しようとしました(おそらく、何か小さなものを見逃しているだけで、誰かがそれを正しく行うためのヒントを与えることができます):

  1. ModelElement eパラメータを追加doSomething
  2. Condition.IsTrue(elements.Contains(e))に条件を追加doSomething
  3. config-script でアクションを定義する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 を推奨できますか?

4

1 に答える 1

0

私は問題が何であるかを理解しました。上にスケッチしたソリューションは実際に機能しましたが、要素が空の場合nullから戻っSelectElement()たため、where句の条件を満たせませんでした。そのため、nullを返す代わりに、Nullオブジェクトに似た「不正な」要素を返すことにしました。したがって、私のソリューション全体は次のようになります。

この機械:

machine Full() : Main
{
  Init(); CreateElement();CreateOtherElement();CreateIllegal(); SelectAndDo* || ModelProgram
}

CreateIllegal()条件が満たされるように、afaikが必要ですSelectAndDo

そのほかに、モデルプログラムにこの不正な値のチェックを追加しました。

編集:

Choice.Some<T>実際には、私が知らなかった、より良い、簡単な方法があります。

于 2013-02-16T02:11:09.957 に答える