2014-10-10 134 views
2

我实现授权我的戏框架(2.3.5版本)的应用程序为每official security documentation担保特质造成SPEC2单元测试编译错误

trait Secured { 

    def username(request: RequestHeader) = request.session.get(Security.username) 

    def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Login.index) 

    def withAuth(f: => String => Request[AnyContent] => Result) = { 
    Security.Authenticated(username, onUnauthorized) { user => 
     Action(request => f(user)(request)) 
    } 
    } 

} 

然而,当我装修我的控制器动作与withAuth功能如下所示:

def export = withAuth { username => implicit request => 
    val csv = csv() 
    Ok(csv) 
    .as("text/csv") 
    .withHeaders(
     CONTENT_DISPOSITION -> ("attachment; filename=export.csv"), 
     CONTENT_LENGTH -> csv.length.toString 
    ) 
} 

我得到的编译错误在我的控制器specs2单元测试:

"export data as CSV" in { 
    val controller = new controllers.DataController 
    val result = controller.export().apply(FakeRequest()) 
    headers(result) must havePair("Content-Disposition" -> ("attachment; filename=export.csv")) 
} 

headers测试辅助函数调用失败,出现以下编译器错误消息:

类型不匹配;发现:play.api.libs.iteratee.Iteratee [数组[字节],play.api.mvc.Result]要求:scala.concurrent.Future [play.api.mvc.Result]

我做有问题?我尝试了其他Stackoverflow用户的一些remediessuggested,但它们似乎都依赖于设置正文类型,但我的操作没有正文类型。

看起来好像withAuth的呼叫模糊了某些被包裹的动作类型,所以也许有更安全的方式表达Secured特征?

回答

1

尝试修改此:

val result = controller.export().apply(FakeRequest()) 

到这一点:

val result = controller.export().apply(FakeRequest()).run 

然后它应该工作。