Search code examples
playframeworkspecs2

Play framework specs2 url testing


I'm trying to figure out how to test multiple URLs in the Play framework using specs2 and I can't seem to figure out the proper way to do it without starting multiple servers.

import org.specs2.mutable._

import play.api.test._
import play.api.test.Helpers._
import play.api.libs.ws.WS

class testServer extends Specification {

  running(TestServer(9000)) {
    "Server starts" in {
      await(WS.url("http://localhost:9000").get).status must equalTo(OK)
    }
    "Who" in {
      await(WS.url("http://localhost:9000/url1").get).status must equalTo(OK)
    }
    "How" in {
      await(WS.url("http://localhost:9000/url2").get).status must equalTo(OK)
    }
    "Why" in {
      await(WS.url("http://localhost:9000/url3").get).status must equalTo(OK)
    }
    "Test4" in {
      await(WS.url("http://localhost:9000/url4").get).status must equalTo(OK)
    }
    "Test" in {
      await(WS.url("http://localhost:9000/url5").get).status must equalTo(OK)
    }
    "Help" in {
      await(WS.url("http://localhost:9000/url6").get).status must equalTo(OK)
    }
    "Bogus" in {
      await(WS.url("http://localhost:9000/url7").get).status must equalTo(OK)
    }
  }
}

Solution

  • See the answer to this question. You need to create a new context for each example. For instance you can write:

    import org.specs2._
    import execute._
    import specification.AroundExample
    
    class testServer extends Specification with AroundExample {
      def around[R <% Result](r: =>R) = 
        running(TestServer(9000))(r)
    
       "Server starts" in {
         await(WS.url("http://localhost:9000").get).status must equalTo(OK)
       }
       ...
    }