我要做的是测试身份验证处理程序,但我的问题归结Session
为注册表中没有实例。
一个示例测试:
package whatever
import groovy.transform.CompileStatic
import ratpack.groovy.handling.GroovyChainAction
import ratpack.groovy.test.handling.GroovyRequestFixture
import ratpack.http.Status
import ratpack.session.Session
import spock.lang.Specification
class SessionChainTest extends Specification {
GroovyChainAction sessionChain = new GroovyChainAction() {
@Override
@CompileStatic
void execute() throws Exception {
get('foo') {
Session s = get Session
// Stuff using session here
}
}
}
def "should get session"() {
given:
def result = GroovyRequestFixture.handle(sessionChain) {
uri 'foo'
method 'GET'
}
expect:
result.status == Status.OK
// If the server threw, rethrow that
Throwable t = result.exception(Throwable)
if (t) throw t // <<< Throws NotInRegistryException because no Session in registry
}
}
(额外的重新抛出是为了让我们看到在ratpack测试中抛出的异常,因为默认情况下它会被捕获并隐藏在结果中。)
我知道原则上我可以创建一个 Session 实例并使用一个registry { add <Session instance> }
块将其添加到注册表中,但是我已经深入研究了 Ratpack 代码,并且创建一个 Session 对象需要获取许多不同的其他组件并将它们传递给SessionModule#sessionAdaptor
(或DefaultSession
构造函数)。我找不到任何这样做的例子,看来这个调用是由 Guice 依赖注入魔法处理的,我无法解开。
在应用程序中执行此操作的常用方法是使用bind { module SessionModule }
块,但这不能从RequestFixture#execute
.
由于会话是任何 Web 应用程序的生计,我的直觉是这可能是一个容易解决的问题,我只是没有找到正确的方法吗?