2013-02-15 5 views
0

В настоящее время я оцениваю Spec Explorer, но у меня проблема с абстрактными характеристиками поведения функции. у меня есть что-то вроде: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. Определим действие в конфигурационном-скрипта SelectElement
  4. Определить машину SelectAndDo в конфиг-Script следующим образом:

    machine SelectAndDo() : Main 
    { 
        let ImplementationElement e 
         Where {.Condition.IsTrue(e.Equals(SelectElement()));.} 
         in doSomething(e) 
    } 
    
  5. Использование SelectAndDo вместо doSomething

Однако, это не работает, потому что изучение соответствующей модели входит в состояние ошибки. Если это вообще не работает, есть ли хорошая альтернатива Spec Explorer для Windows, желательно стабильная? Может ли FsCheck быть рекомендованным для тестирования систем с сохранением работоспособности?

ответ

0

Я понял, в чем проблема. Решение, набросанное выше, работало на самом деле, но я вернулся null от SelectElement(), если элементы были пустыми, поэтому условие в where-clause не могло быть выполнено. Поэтому вместо того, чтобы возвращать null, я решил вернуть «незаконный» элемент, аналогичный Null Object. Так целые мои решения выглядит примерно так:

Машинка:

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

CreateIllegal() является AFAIK нужно, так что условия в SelectAndDo могут быть выполнены.

Кроме того, я добавил проверки для этой незаконной стоимости в программе модели.

EDIT:

Существует на самом деле лучше, прямой способ с помощью Choice.Some<T>, который я не знаю.