Тестирование Scala приложения с помощью ScalaTest - PullRequest
0 голосов
/ 24 февраля 2020

Я просматривал документацию по ScalaTest, но смог выяснить, какой подход я должен использовать для тестирования приложения.

Код разделен между контроллером и службой. например. Пример кода контроллера

@Singleton
class Controller1 @Inject()(service1: ServiceClass1, authAction : AuthAction)
    extends InjectedController {
//returns a list[]
  def getSomeValue() = authAction {
    val res = service1.getValue1()
    val json = Json.toJson(res)
    Ok(json)
  }
}

Пример кода службы -:

def getValue1() = {
    implicit val graph = db.g

    val infos = graph.V.hasLabel[someModel].toList()
    infos.map(vertex => {
      val someModel = vertex.toCC[someModel]
      val item = info(someId =
                              someModel.someId.getOrElse("").toString,
                            category = SomeModel.category,
                            description = someModel.description)
      item
    })
  }

Я очень новичок в тестировании и Scala оба, я также понимаю код, но не понимаю, куда начать. Это просто пример кода, который очень похож.

1 Ответ

0 голосов
/ 07 марта 2020

Кажется, что то, что вы ищете, это способ высмеивать service1.getValue1() в вашем Controller1.

Scalatest поддерживает несколько различных способов сделать это: http://www.scalatest.org/user_guide/testing_with_mock_objects

В вашем случае, чтобы проверить def getSomeValue(); вам нужно определить макет и установить правильные ожидания, чтобы при вызове из теста макет возвращал ожидаемые ответы.

Если вы хотите использовать scala mock, вам потребуется чтобы добавить его в качестве зависимости в вашей конфигурации сборки sbt. Вы можете сделать это, добавив эту зависимость в свои тесты:

  "org.scalamock" %% "scalamock" % "4.4.0" % Test

И тогда ваш тест может выглядеть примерно так:

import org.scalamock.scalatest.MockFactory
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class Controller1Spec extends AnyFlatSpec with Matchers with MockFactory {
  "Controller1" should "respond with a valid response" in {
    val mockService = mock[ServiceClass1]
    (mockService.getValue1 _).when().returning("Some Response").once()

    val mockAuthAction = mock[AuthAction] //assuming you've got an action called AuthAction
    //you'd need to mock this one too, in order for it to work
    (mockAuthAction.invokeBlock _) expects(_) onCall((r,b) => b(r))

    new Controller1(mockService, mockAuthAction) shouldBe Ok("Some Response")
  }
}

Есть ряд сообщений о насмешках для Scala, который вы сможете найти, например, здесь: https://scalamock.org/user-guide/advanced_topics/

...