недетерминированные тесты спрея и актора

Привет, вначале я хотел бы извиниться за свой английский :)

akka = 2.3.6
spray = 1.3.2
scalatest = 2.2.1

Я столкнулся со странным поведением маршрутов teting, которые запрашивают акторов в директиве handleWith,
У меня маршрут с директивой handleWith

pathPrefix("firstPath") {
  pathEnd {
    get(complete("Hello from this api")) ~
    post(handleWith { (data: Data) =>{ println("receiving data") 
      (dataCalculator ? data).collect {
        case Success(_) =>
          Right(Created -> "")
        case throwable: MyInternalValidatationException =>
          Left(BadRequest -> s"""{"${throwable.subject}" : "${throwable.cause}"}""")
      }
    }})
  }
}


и простой субъект, который всегда отвечает при получении данных объекта и имеет собственный блок приема, заключенный в LoggingReceive, поэтому я должен видеть журналы, когда сообщение получает субъект

и я тестирую его, используя (я думаю, простой код)

class SampleStarngeTest extends WordSpec with ThisAppTestBase with OneInstancePerTest
with routeTestingSugar {
  val url = "/firstPath/"

  implicit val routeTestTimeout = RouteTestTimeout(5 seconds)

  def postTest(data: String) = Post(url).withJson(data) ~> routes

  "posting" should {
    "pass" when {
      "data is valid and comes from the identified user" in {
        postTest(correctData.copy(createdAt = System.currentTimeMillis()).asJson) ~> check {
          print(entity)
          status shouldBe Created
        }
      }
      "report is valid and comes from the anonymous" in {
        postTest(correctData.copy(createdAt = System.currentTimeMillis(), adid = "anonymous").asJson) ~> check {
          status shouldBe Created
        }
      }
    }
  }
}


и поведение:
Когда я запускаю все тесты в пакете (используя Intellij Idea 14 Ultimate) или тест sbt, я получаю одни и те же результаты
одно выполнение -> все тесты проходят
и следующий -> не все проходят, это не проходит, я вижу:
1. сбой, потому что запрос не был ни завершен, ни отклонен в течение X секунд (X до tp 60)
2. Вывод системной консоли из маршрута из строки post (handleWith {(data: Data) => {println ("получение данных"), поэтому код в handleWith был выполнен
3. запросить исключение тайм-аута из кода маршрута, но не всегда (среди неудачных тестов) < br /> 4. Нет журналов от субъекта LoggingReceive, поэтому у субъекта нет возможности ответить
5. Когда я повторно запускаю тесты, результаты даже отличаются от предыдущих

Есть ли проблемы с потоком? или тестовые модули, блокировка потоков внутри библиотек? или что-то еще? Понятия не имею, почему это не работает :(


person user3416836    schedule 01.12.2014    source источник
comment
Не думаю, что у нас достаточно информации, чтобы ответить на ваш вопрос. Учитывая, что получаемые данные всегда отображаются на консоли, похоже, что с вашим субъектом dataCalculator что-то не так. Кстати, ваш блок .collect нарушает соглашение при использовании Either (см. stackoverflow.com/questions/1193333/). Вообще говоря, условия ошибки отображаются слева, а условия успеха отображаются справа. Вероятно, это не причина вашей ошибки, но будет сбивать с толку других, читающих ваш код.   -  person ffxtian    schedule 01.12.2014
comment
отредактирован в связи с комментарием ffxtian   -  person user3416836    schedule 01.12.2014
comment
Возможно ли, что вы не показываете правильный код теста / маршрута? Ваш маршрут соответствует firstPath строго без косой черты в конце, но в вашем тесте вы проверяете firstPath / с завершающей косой чертой. Но он должен вести себя одинаково для разных исполнений ... Кроме того, у вас могут быть проблемы, связанные с отсутствием динамической директивы, поскольку вы сопоставляете тип запроса без извлечения в случае получения (spray.io/documentation/1.1-SNAPSHOT/spray-routing/), что может привести к для двойных ответов или аналогичных со случайным временем.   -  person Diego Martinoia    schedule 01.12.2014