标签: specs2

玩!框架:自定义运行哪些测试

我玩了!2用于Scala应用程序,我使用Specs2进行测试.我可以使用test命令或特定规范运行所有测试test-only MyParticularSpec.

我想做的是在规范中标记一些特定的规范,甚至是单个方法,以便执行以下操作:

  • 运行所有非集成的测试(即不访问外部资源)
  • 运行所有在写入模式下不访问外部资源的测试(但仍在运行读取测试)
  • 运行所有测试,但给定一个

等等.

我想这样的事情应该是可行的,也许是通过添加一些注释,但我不知道如何去做.

是否存在选择性运行某些测试而不是其他测试的机制?

编辑我在使用时已经回答了自己test-only.命令行选项仍然不适用于该test任务.在sbt指南之后,我尝试创建一个额外的sbt配置,比如

object ApplicationBuild extends Build {
  // more settings
  lazy val UnitTest = config("unit") extend(Test)
  lazy val specs = "org.scala-tools.testing" %% "specs" % "1.6.9" % "unit"

  val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA)
    .configs(UnitTest)
    .settings(inConfig(UnitTest)(Defaults.testTasks) : _*)
    .settings(
      testOptions in UnitTest += Tests.Argument("exclude integration"),
      libraryDependencies += specs
    )
}
Run Code Online (Sandbox Code Playgroud)

当我传递没有选项的参数时,例如当我放置时,这是有效的Test.Argument("plan").但我无法找到如何传递更复杂的论点.我试过了

Tests.Argument("exclude integration")
Tests.Argument("exclude=integration")
Tests.Argument("-exclude integration")
Tests.Argument("-exclude=integration") …
Run Code Online (Sandbox Code Playgroud)

testing scala sbt specs2 playframework-2.0

13
推荐指数
3
解决办法
4423
查看次数

无法使用Action.async测试控制器

我正在尝试测试控制器,它正在使用新的Action.async.下面的文档我已经排除了控制器下的部分我想测试用类型引用来分隔特征:

trait UserController { this: Controller =>
  def index() = Action { /* snip */ }
  def register() = Action.async(parse.json) { request => /* snip */ }
}
Run Code Online (Sandbox Code Playgroud)

文档说明我应该将其测试为:

object UsersControllerSpec extends PlaySpecification with Results {
  class TestController() extends Controller with UserController
    "index action" should {
      "should be valid" in {
        val controller = new TestController()
        val result: Future[SimpleResult] = controller.index().apply(FakeRequest())
        /* assertions */
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

对于index()方法它完美地工作,不幸的是我无法做同样的事情register(),因为在它上面应用FakeRequest返回的实例Iteratee[Array[Byte], SimpleResult].我注意到它有 …

scala playframework specs2 playframework-2.2

12
推荐指数
2
解决办法
3300
查看次数

在FakeRequest中使用MultipartFormData进行框架测试

我目前正在为Play Framework 2.2.x应用程序编写一些Specs2测试,该应用程序接受MultipartFormData提交作为其功能的一部分.

我已使用以下格式成功编写了带有文本和JSON实体的其他测试:

"respond to POST JSON with description field present" in {
  running(FakeApplication()) {
    val response = route(FakeRequest(POST, "/submission.json").withJsonBody(toJson(Map("content" -> toJson("test-content"), "description" -> toJson("test-description"))))).get
    status(response) must equalTo(OK)
    contentType(response) must beSome.which(_ == "application/json")
    contentAsString(response) must contain(""""description":"test-description"""")
    contentAsString(response) must contain(""""content":"test-content"""")
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用.withMultipartFormData方法时,我收到以下错误:

Cannot write an instance of play.api.mvc.AnyContentAsMultipartFormData to HTTP response. Try to define a Writeable[play.api.mvc.AnyContentAsMultipartFormData]
val response = route(FakeRequest(PUT,"/submission.json/1/files").withMultipartFormDataBody(data)).get
                    ^
Run Code Online (Sandbox Code Playgroud)

我试图调试的MultipartFormData测试的形式如下:

"respond to file PUT form with details not specififed" in {
  running(FakeApplication()) {
     val basePath:String = Play.application.path.getCanonicalPath(); …
Run Code Online (Sandbox Code Playgroud)

testing scala multipartform-data playframework specs2

12
推荐指数
2
解决办法
6053
查看次数

如何在specs2中断言对象的类型

在specs2测试中,如何验证函数返回值的类型?

说,功能:

trait P
trait C1 extends P
trait C2 extends P

def test(n:Int): P = if(n%2==0) new C1 else new C2
Run Code Online (Sandbox Code Playgroud)

测试:

"test" should {
   "return C1 when n is even" in {
       val result = test(2)
       // how to assert
       // 'result' should have type of C1?
   }
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何断言价值的类型result

types scala assertions specs2

12
推荐指数
1
解决办法
3108
查看次数

如何在Mockito和Scala中使用隐式匹配器来存根方法调用

我的应用程序代码使用AService

trait AService {
    def registerNewUser (username: String)(implicit tenant: Tenant): Future[Response]
}
Run Code Online (Sandbox Code Playgroud)

注册新用户.Class Tenant是一个简单的案例类:

case class Tenant(val vstNumber:String, val divisionNumber:String) 
Run Code Online (Sandbox Code Playgroud)

Trait AServiceMock通过使用模拟版本的AService来模拟注册逻辑

trait AServiceMock {
  def registrationService = {
    val service = mock[AService]
    service.registerNewUser(anyString) returns Future(fixedResponse)
    service
  }
}
Run Code Online (Sandbox Code Playgroud)

低,每当在AService上调用registerNewUser时,响应将是"fixedResponse"(在别处定义).

我的问题是,如何将隐式租户参数定义为像anyString一样的mockito匹配器?

顺便说一句.我正在使用Mockito和Specs2(和Play2)

scala implicit matcher mockito specs2

12
推荐指数
1
解决办法
3383
查看次数

通过配置中断播放规范,因为"没有启动的应用程序"

我将一些字符串外部化为HOCON application.conf.我正在访问这样的配置值:

import play.api.Play.current
import play.api.Play.configuration

configuration.getString("foo.bar").get()
Run Code Online (Sandbox Code Playgroud)

尽可能早,如果缺少密钥就会快速失败,就像文档说的那样.

现在我的一些依赖于配置对象的测试失败了,堆栈跟踪表明:

Caused by: java.lang.RuntimeException: There is no started application

我假设这与配置有关?我怎样才能解决这个问题?(测试是规格2)

configuration specs2 playframework-2.0

11
推荐指数
1
解决办法
1万
查看次数

如何在tests2的gradle中将测试输出设置为console而不是html

我正在使用specs2/scala进行单元测试并使用gradle来构建.默认情况下,单元测试输出转到html文件.我想让输出直接转到stdout(就像sbt一样).

有人知道神奇的咒语吗?

谢谢翼

gradle specs2

11
推荐指数
2
解决办法
3919
查看次数

如何在IntelliJ IDEA下运行所有​​Specs2测试?

在我的Scala项目中,我的Specs2测试结构如下:

src/test/scala
-> my.package
---> my.package.sub1
------> SomeTest1
------> SomeTest2
---> my.package.sub2
------> SomeTest3
Run Code Online (Sandbox Code Playgroud)

我正在使用SBT构建所有这些,我可以用来sbt test在我的包中运行所有测试.

我想使用IntelliJ IDEA的内置Specs2运行配置支持.我指出它使用所有测试my.package.

运行它会产生错误消息Error running <run config name>: Not found suite class.它无法找到Specs2测试套件.如果我把它指向一个子包,IDEA会运行我的测试.

如何配置IDEA以查看所有包并运行它找到的所有测试套件?

scala intellij-idea specs2

11
推荐指数
1
解决办法
6077
查看次数

如何运行嵌入式弹性搜索实例进行测试

我正在使用嵌入式弹性搜索实例的设置进行单元测试,但是当我用sbt(~test-only <my-test>)连续运行测试时,系统变得越来越不稳定,直到它冻结并且必须被火烧死.

我正在努力工作的事情是:

  • 隔离
  • 清理
  • 关掉

设置它的正确方法是什么(解决方案最好使用specs2,但也欢迎基于Java)?

elasticsearch specs2

10
推荐指数
1
解决办法
1万
查看次数

在Play 2.1和Scala中编写用于文件上载的测试用例

我发现了以下问题/答案:

在Play 2.0 FakeRequest中测试MultipartFormData

但似乎Play 2.1中的情况发生了变化.我试过调整这样的例子:

"Application" should {

"Upload Photo" in {
  running(FakeApplication()) {
    val data = new MultipartFormData(Map(), List(
        FilePart("qqfile", "message", Some("Content-Type: multipart/form-data"), 
            TemporaryFile(getClass().getResource("/test/photos/DSC03024.JPG").getFile()))
        ), List())
    val Some(result) = routeAndCall(FakeRequest(POST, "/admin/photo/upload", FakeHeaders(), data)) 
    status(result) must equalTo(CREATED)
    headers(result) must contain(LOCATION)
    contentType(result) must beSome("application/json")  
Run Code Online (Sandbox Code Playgroud)

但是每当我尝试运行请求时,我都会得到一个空指针异常:

[error] ! Upload Photo
[error]     NullPointerException: null (PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3$$anonfun$apply$4.apply(PhotoManagementSpec.scala:28)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3$$anonfun$apply$4.apply(PhotoManagementSpec.scala:25)
[error] play.api.test.Helpers$.running(Helpers.scala:40)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
Run Code Online (Sandbox Code Playgroud)

如果我尝试用刚刚路由替换已弃用的routeAndCall(并删除结果周围的Option),我会收到一个编译错误,指出它无法将一个MultipartFormData [TemporaryFile]实例写入HTTP响应.

使用Scala在Play 2.1中设计此测试的正确方法是什么?


编辑:尝试修改代码以仅测试控制器:

"Application" should {

"Upload Photo" in {

   val data = new …
Run Code Online (Sandbox Code Playgroud)

testing scala specs2 playframework-2.0

10
推荐指数
3
解决办法
5343
查看次数