Методы Specs2 и @Before/@After

Учитывая код вроде:

class RESTAcceptanceTest extends Specification {

  override def is = anonymous ^ signinOAuth

  def anonymous = "Something"       ^ givenSomething ^
                  "must happen"     ^ mustHappen 
  end

  def signinOAuth = "Signin"                ^ givenSignin ^
                    "works as expected"     ^ userExistsInDatabase 
  end

  // rest of object definitions

}

как мне убедиться, что один и тот же код до и после выполняется до/после "анонимного" и "signinOAuth", а метод "после" должен выполняться, даже если сам тест не проходит?


person jdevelop    schedule 12.01.2013    source источник


Ответы (2)


Если вы используете шаги Given/When/Then, вы можете использовать Context для управления тем, что выполняется до и после каждого примера:

import org.specs2._
import specification._

class MySpec extends Specification { def is = 
  "anonymous" ^ 
    "something" ^ something ^
    "must happen" ^ mustHappen ^ endp^
  "OAuth"^ 
    "signing" ^ signing ^
    "works ok" ^ worksOk

  lazy val something: Given[Int] = (s: String) => { s.pp; 1 } 
  lazy val mustHappen: Then[Int] = (i: Int) => (s: String)  => 
    context { s.pp; i must_== 1       }

  lazy val signing:  Given[Int] = (s: String) => { s.pp; 2 }
  lazy val worksOk: Then[Int] = (i: Int) => (s: String) => 
    context { s.pp; i must_== 2 }

  lazy val context = new BeforeAfter {
   def  before = "before".pp
   def after = "after".pp
  }
}

В приведенном выше коде метод apply объекта context используется для переноса кода для выполнения с помощью before и after. Также, если вы добавите ошибку в один из примеров, вы увидите, что код «после» всегда выполняется.

PS: pp — это служебный метод, такой как println, для отображения чего-либо в терминале во время выполнения. Преимущество перед println в том, что он возвращает свой аргумент, так что вы можете написать 1.pp must_== 1

person Eric    schedule 13.01.2013
comment
Спасибо! Мне это почти понравилось, но я не понял, как работать с контекстами. Я хотел бы обновить руководство пользователя Specs2 этим примером. - person jdevelop; 13.01.2013
comment
Я обновил документацию, но также включил использование трейтов BeforeExample, AfterExample,... с шагами Given/When/Then (в 1.12.4-SNAPSHOT для Scala 2.9.2 и 1.13.1-SNAPSHOT для Scala 2.10). См. документацию: etorreborre.github. com/specs2/guide-SNAPSHOT/guide/. - person Eric; 14.01.2013

Посмотрите документацию: http://etorreborre.github.com/specs2/guide/org.specs2.guide.Structure.html#Before/After

person Emil Ivanov    schedule 12.01.2013
comment
На самом деле я не понимаю, как это должно работать. Я использую спецификации с заданными/когда/затем последовательностями, поэтому я не понимаю, как обернуть этот признак BeforeAfter вокруг него. - person jdevelop; 12.01.2013
comment
это должно работать: etorreborre.github.io/ spec2/guide/SPECS2-3.6/ - person simou; 21.05.2015