Scala测试:使用其他属性上传文件 - MultipartFormData

时间:2016-01-13 12:42:24

标签: scala testing file-upload multipartform-data

我实际上是在尝试测试新产品的创建。 产品的一个属性是图片。该图片应存储在名为" images"的目录中。在数据库中,只有文件名应作为字符串存储在图片列中。 所以我尝试创建一个MultiPartFormData伪请求,并将属性添加到MultiPartFormData的dataParts属性中。

但是在执行测试时我得到以下错误:

 \test\InventoryControllerSpec.scala:50: Cannot write an instance of play.api.mvc.MultipartFormData[play.api.
    libs.Files.TemporaryFile] to HTTP response. Try to define a Writeable[play.api.mvc.MultipartFormData[play.api.libs.Files.TemporaryFile]]

产品型号如下所示:

case class Product(id: Option[Int],
               name: String,
               category: String,
               picture: Option[String],
               amount: Int,
               criticalAmount: Int
                ) {
}

object Product {

  implicit val productFormat = Json.format[Product]

  def tupled(t: (Option[Int], String, String, Option[String], Int, Int)) =
    Product(t._1, t._2, t._3, t._4, t._5, t._6)

  def toTuple(p: Product) = Some((p.id, p.name, p.category, p.picture, p.amount, p.criticalAmount))
}

数据库模型如下所示:

class Products(tag: Tag) extends Table[Product](tag, "PRODUCTS"){
  def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
  def name = column[String]("NAME")
  def category = column[String]("CATEGORY")
  def picture = column[String]("PICTURE")
  def amount = column[Int]("AMOUNT")
  def criticalAmount = column[Int]("CRITICALAMOUNT")
  def * = (id.?, name, category, picture.?, amount, criticalAmount) <>(Product.tupled, Product.toTuple)
}

我认为控制器中的create函数也应该起作用:

    val productForm = Form(
        tuple(
          "name" -> nonEmptyText,
          "category" -> nonEmptyText,
          "amount" -> number,
          "criticalAmount" -> number
        ) 
      )

  def create = SecuredAction(IsInventoryAdmin()
  ).async(parse.multipartFormData) {
    implicit request => {
      val pr : Option[Product] = productForm.bindFromRequest().fold (
        errFrm => None,
        product => Some(Product(None, product._1, product._2, None, product._3,product._4))
      )
      request.body.file("picture").map { picture =>
        pr.map { product  =>
          val filename = picture.filename
          val contentType = picture.contentType
          val filePath = s"/images/$filename"
          picture.ref.moveTo(new File(filePath), replace=true)
          val fullProduct = product.copy(picture = Some(filePath))
          inventoryRepo.createProduct(fullProduct).map(p => Ok(Json.toJson(p)))
        }.getOrElse{
          Future.successful(
            BadRequest(Json.obj("message" -> "Form binding error.")))
        }
      }.getOrElse {
        Future.successful(
          BadRequest(Json.obj("message" -> "File not attached.")))
      }
    }
  }

现在我的问题是创建一个Scala测试,它会检查功能是否正常。目前我的代码看起来像这样:

"allow inventory admins to create new products" in new RepositoryAwareContext {
      new WithApplication(application) {
        val token = CSRF.SignedTokenProvider.generateToken

       val tempFile = TemporaryFile(new java.io.File("/images/the.file"))
        val part = FilePart[TemporaryFile](key = "the.file", filename = "the.file", contentType = Some("image/jpeg"), ref = tempFile)
        val formData = MultipartFormData(dataParts = Map(("name", Seq("Test Product")),("category", Seq("Test Category")),("amount", Seq("50")), ("criticalAmount", Seq("5"))), files = Seq(part), badParts = Seq(), missingFileParts = Seq())
        val result = route(FakeRequest(POST, "/inventory", FakeHeaders(), formData)
          .withAuthenticator[JWTAuthenticator](inventoryAdmin.loginInfo)
          .withHeaders("Csrf-Token" -> token)
          .withSession("csrfToken" -> token)
        ).get

        val newInventoryResponse = result
        status(newInventoryResponse) must be(OK)
        //contentType(newInventoryResponse) must be(Some("application/json"))
        val product = contentAsJson(newInventoryResponse).as[Product]
        product.id mustNot be(None)
        product.name mustBe "Test Product"
        product.category mustBe "Test Category"
      }
    }

如果有人可以帮助我,那将是很棒的,因为我无法找到自己的解决方案......

亲切的问候!

0 个答案:

没有答案