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 edoSomething
  2. 添加条件Condition.IsTrue(elements.Contains(e))doSomething
  3. 在配置脚本中定义一个动作SelectElement
  4. 在 config-Script 中定义一台机器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

我弄清楚了问题所在。上面概述的解决方案实际上有效,但是我nullSelectElement()if 元素为空返回,因此无法满足 where 子句中的条件。因此,我决定返回一个类似于 Null 对象的“非法”元素,而不是返回 null。所以我的整个解决方案看起来像这样:

机器:

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

CreateIllegal()是 afaik 需要的,这样SelectAndDo才能满足条件。

除此之外,我在模型程序中添加了对这个非法值的检查。

编辑:

实际上有一种更好、更直接的使用方式Choice.Some<T>,我不知道。

于 2013-02-16T02:11:09.957 回答