2014-03-13 78 views
0

播放框架2.1版使用Scala,我想測試我的無效電話(缺少參數)ProductController的,我想獲得錯誤請求響應..測試REST API控制器在Scala和遊戲框架2.1

控制器代碼是返回確定(Json.toJson(some class ..))或BadRequest(Json.toJson(some class ..))incase something goes wrong。

我定義的測試類:

class ProductApplicationTests extends PlaySpecification 
with Mockito 
with ProductServiceComponent 
{ 
    lazy val productService = mock[ProductService] 
    ... other things 

def app = FakeApplication(
withoutPlugins = Seq("com.typesafe.plugin.RedisPlugin"), 
withGlobal = Some(
    new GlobalSettings { 
    override def getControllerInstance[A](clazz: Class[A]) = clazz match { 
     case c if c.isAssignableFrom(classOf[ProductController]) => new ProductController(ProductApplicationTests.this).asInstanceOf[A] 
     case _ => super.getControllerInstance(clazz) 
    } 
    } 
) 
) 

def mockStuff = { 
productService.addProduct(any[AddProductRequest]) returns 
    DTOResponse(product.id.get) 

productService.updateProduct(any[UpdateProductRequest]) returns 
    DTOResponse(product.id.get) 

productService.deleteProduct(any[DeleteProductRequest]) returns 
    DTOResponse(product.id.get) 
} 
step(mockStuff) 

"Application" should { 
"Get product with no tenant Id" in {running(FakeApplication()) { 
val req = FakeRequest(method = "POST", uri = routes.ProductController.getProducts("en_US", "1", "1").url, 
       headers = FakeHeaders(
       Seq("Content-type"->Seq("application/json")) 
      ), 
       body = None 
      ) 
    val Some(result) = route(req) 

    status(result) must equalTo(400) 

問題
我得到錯誤:

Cannot write an instance of None.type to HTTP response. Try to define a Writeable[None.type] 

我按照這篇文章:Play 2 - Scala FakeRequest withJsonBody,我不明白什麼即時做錯了。 當我發送這個代碼作爲測試它的作品..

"Get product with valid parameters" in new WithApplication(app) { 
    val result = route(FakeRequest(GET, "/v1.0/products?lang=en_US&t=1&ids=1,2")) 
    result must beSome 
    status(result.get) must equalTo(OK) 
    contentType(result.get) must beSome.which(_ == "application/json") 
    contentAsString(result.get) must contain("products") 
    contentAsString(result.get) must contain("notFoundIds") 
} 

感謝您的任何意見/答案..

通過我的global.scala看起來像這樣:

override def onBadRequest(request: RequestHeader, error: String) = { 
var errorResponse:ErrorResponse[String] = ErrorResponse(ErrorCode.GeneralError, "Error processing request", 500) 
errorResponse.addMessage(error) 
Future.successful(BadRequest(Json.toJson(errorResponse))) 
} 

override def onError(request: RequestHeader, ex: Throwable) = 
{ 
    var errorResponse:ErrorResponse[String] = ErrorResponse(ErrorCode.GeneralError, "Error processing request", 500) 
    errorResponse.addMessage(ex.getMessage) 
    Future.successful(BadRequest(Json.toJson(errorResponse))) 
} 

如果我跑獲取RESTAPI測試客戶端,我得到:

{"code":100,"message":"Error processing request - Missing parameter: t"} 

回答

0

如果你看看source for FakeRequest,你會注意到你需要將主體設置爲AnyContentAsEmpty。在旁註中,第一個測試方法應該是POST嗎?你的其他例子似乎是GET。

至於你在RESTAPI TET客戶端運行Get第二個問題,錯誤消息似乎非常清楚,你需要提供參數t,你在前面的例子中那樣val result = route(FakeRequest(GET, "/v1.0/products?lang=en_US&t=1&ids=1,2"))