Как я могу пропустить тест в specs2 без сопоставителей?

Я пытаюсь протестировать некоторые вещи, зависящие от базы данных, с помощью spec2 в scala. Цель состоит в том, чтобы проверить «работу базы данных», а затем выполнить тест. Я понял, что могу использовать orSkip из класса Matcher, если база данных не работает.

Проблема в том, что я получаю вывод для одного условия соответствия (как ПРОШЕЛ), а пример помечен как ПРОПУСК. Что я хочу вместо этого: выполнить только один тест, помеченный как «ПРОПУСК», если тестовая база данных отключена. А вот код моего "TestKit"

package net.mycode.testkit

import org.specs2.mutable._
import net.mycode.{DB}


trait MyTestKit {

  this: SpecificationWithJUnit =>

  def debug = false

  // Before example
  step {
    // Do something before
  }

  // Skip the example if DB is offline
  def checkDbIsRunning = DB.isRunning() must be_==(true).orSkip

  // After example
  step {
    // Do something after spec
  }
}

А вот код моей спецификации:

package net.mycode

import org.specs2.mutable._
import net.mycode.testkit.{TestKit}
import org.junit.runner.RunWith
import org.specs2.runner.JUnitRunner

@RunWith(classOf[JUnitRunner])
class MyClassSpec extends SpecificationWithJUnit with TestKit with Logging {

  "MyClass" should {
    "do something" in {
      val sut = new MyClass()
      sut.doIt must_== "OK"
    }

  "do something with db" in {
    checkDbIsRunning

    // Check only if db is running, SKIP id not
  }
}

Вышло сейчас:

Test MyClass should::do something(net.mycode.MyClassSpec) PASSED
Test MyClass should::do something with db(net.mycode.MyClassSpec) SKIPPED
Test MyClass should::do something with db(net.mycode.MyClassSpec) PASSED

И вывод я хочу, чтобы это было:

Test MyClass should::do something(net.mycode.MyClassSpec) PASSED
Test MyClass should::do something with db(net.mycode.MyClassSpec) SKIPPED

person Alebon    schedule 07.06.2012    source источник
comment
Не могли бы вы привести пример текущего вывода консоли и желаемого?   -  person Eric    schedule 08.06.2012
comment
Добавлены выходные образцы   -  person Alebon    schedule 08.06.2012


Ответы (3)


Я думаю, вы можете использовать простое условное выражение, чтобы делать то, что хотите:

class MyClassSpec extends SpecificationWithJUnit with TestKit with Logging {

  "MyClass" should {
    "do something" in {
      val sut = new MyClass()
      sut.doIt must_== "OK"
    }
    if (DB.isRunning) {
      // add examples here
      "do something with db" in { ok }
    } else skipped("db is not running")
  }
}
person Eric    schedule 11.06.2012
comment
Это не идеально, но очень полезно ;) - person Alebon; 16.06.2012
comment
@Eric Это вызывает исключение - Неперехваченное исключение при запуске test.functionality.Login: org.specs2.execute.SkipException. Есть ли способ, чтобы это не вызывало исключение? - person 0fnt; 12.05.2015
comment
Я думаю, что вместо этого должно работать "db is not running" in skipped. - person Eric; 12.05.2015
comment
И чтобы быть на 100%, не нужно расширять SpecificationWithJunit - skipped результат для примера является частью основных спецификаций2 StandardResult - person rbellamy; 30.03.2017

Вы пробовали использовать аргумент args(skipAll=true)? См. несколько примеров здесь.

К сожалению (насколько мне известно), в спецификации модуля нельзя пропустить ни одного примера. Однако вы можете пропустить структуру спецификации с таким аргументом, поэтому вам, возможно, придется создать отдельные спецификации:

class MyClassSpec extends SpecificationWithJUnit {

  args(skipAll = false)

  "MyClass" should {
    "do something" in {
      success
    }

    "do something with db" in {
      success
    }
  }
}
person rlegendi    schedule 07.06.2012
comment
кстати, вам не нужен @RunWith при наследовании от WithJUnit - person OlegYch; 07.06.2012
comment
Правильно, исправил. Кстати, я работаю над интеграцией Specs2 в Scala IDE во время GSoC. 2012, надеюсь, в конце лета мы сможем запустить его без каких-либо аннотаций :-) - person rlegendi; 07.06.2012
comment
Существует специальный ярлык, skipAllIf пропустить все примеры, если выполняется условие. Этот метод короче и будет перехватывать исключения, если ваше логическое выражение их выдает. - person Eric; 08.06.2012
comment
Спасибо за разъяснение, @Eric! - person rlegendi; 08.06.2012
comment
@Eric skipAllIf, кажется, больше не существует - person Meredith; 18.12.2013

В спецификации 2.3.10 добавлена ​​новая функция, посвященная этому .

person Meredith    schedule 21.03.2014
comment
Отлично, спасибо, что поделились - person Alebon; 22.03.2014