2013-11-11 3 views
6

Я пытаюсь создать тест specs2 с помощью TestKit от Akka. Я застрял в постоянной ошибке компиляции, я не могу понять, как ее решить, и я буду благодарен за предложения.Использование Akka TestKit с Specs2

Ошибка компиляции является:

TaskSpec.scala:40: parents of traits may not have parameters 
[error] with akka.testkit.TestKit(ActorSystem("testsystem", ConfigFactory.parseString(TaskSpec.config))) 

После предложений от Akka docs и интернета xebia и Акки в действии, я пытаюсь включить тест-набора в specs2 Scope. Вот фрагмент кода, где я получаю ошибку:

class TaskSpec 
extends Specification 
with AsyncTest 
with NoTimeConversions { 

    sequential 

    trait scope 
    extends Scope 
    with TestKit(ActorSystem("testsystem", ConfigFactory.parseString(TaskSpec.config))) 
    with AkkaTestSupport { 
... 

У меня есть следующий помощник:

trait AkkaTestSupport extends After { outer: TestKit => 
    override protected def after: Unit = { 
    system.shutdown() 
    super.after 
    } 
} 

ответ

6

Вот одна вещь, которую вы можете сделать:

import org.specs2.mutable.SpecificationLike 
import org.specs2.specification._ 

class TestSpec extends Actors { isolated 
    "test1" >> ok 
    "test2" >> ok 
} 

abstract class Actors extends 
TestKit(ActorSystem("testsystem", ConfigFactory.parseString(TaskSpec.config))) 
with SpecificationLike with AfterExample { 

    override def map(fs: =>Fragments) = super.map(fs)^step(system.shutdown, global = true) 

    def after = system.shutdown 
} 

Этот должен избегать ошибки компиляции, потому что TestKit является абстрактным классом, и это только смешающиеся черты: SpecificationLike - признак (Specification нет) и AfterExample - это черта.

Также спецификация выше работает в режиме isolated, а это означает, что есть совершенно новый TestSpec объект экземпляра для каждого примера и AfterExample черта гарантирует, что система выключения после каждого примера.

Наконец метод map будет перекрываться с особым step, чтобы убедиться, что system создан для первого TestSpec экземпляра (один объявляя все примеры) будут чисто утилизировать.

+0

Спасибо за это понимание. Я решил решить эту проблему, изменив область действия на класс (пропустил это), но я играю с этой структурой. –

+0

Спасибо Эрик. Каков глобальный = истинный параметр в указанном выше шаге? – Leo

+0

Спецификация 'изолированные' означает, что каждый пример выполняется в своей собственной копии класса спецификации, и все шаги, предшествующие примерам, также выполняются (поскольку они могут быть важны для настройки контекста). За исключением случаев, когда они отмечены как «глобальные», и в этом случае они выполняются только один раз для всей спецификации. – Eric

Смежные вопросы