Spec Explorer - 行为的抽象规范

时间:2013-02-15 22:17:48

标签: c# testing specifications mbt

我目前正在评估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. 中定义操作
  5. 在config-Script中定义一台机器SelectAndDo,如下所示:

    machine SelectAndDo() : Main
    {
      let ImplementationElement e 
          Where {.Condition.IsTrue(e.Equals(SelectElement()));.} 
          in doSomething(e)
    }
    
  6. 使用SelectAndDo代替doSomething
  7. 然而,这不起作用,因为对相应模型的探索进入错误状态。 如果这根本不起作用,那么Windows上的Spec Explorer是否有一个很好的替代方案,最好是稳定的?可以推荐FsCheck来测试有状态系统吗?

1 个答案:

答案 0 :(得分:0)

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

机器:

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

CreateIllegal()需要afaik,以便SelectAndDo中的条件可以实现。

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

修改

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