是否可以仅在测试模式下运行一些控制器和路由?
点击链接时我需要模拟一些响应。我会创建控制器和路径,只有在我运行游戏测试时才可用。
有可能吗?
答案 0 :(得分:5)
正如迈克所说,我博客的代码确实向您展示了如何配置您的路线文件,以便只有某些路线在Dev或Prod模式下可用。所以......
%{ if (play.mode.isDev()) { }%
GET /route4 Application.noProd
GET /route5 Application.noProd
GET /route6 Application.noProd
%{ } }%
但是,这确实会阻止这些路由在Prod模式下工作,但它们不会排除控制器被访问。这样做的原因是,你很可能在路径文件的底部有以下内容
* /{controller}/{action} {controller}.{action}
这意味着我可以使用catch all route访问Application.noProd
操作,这将是以下URL
/application/noprod
因此。如果你想隐藏你的路线和你的控制器,你有几个选择。
您可以删除catch-all路由,这样除了您设置的特定路由之外没有其他条目。这意味着您需要为路径文件中的所有操作指定所有路径。
其次,您可以在行动中检查play.mode.isDev()
,并致电badRequest()
以阻止访问。这将使这更加明显,但在编码中可能是一个不可接受的开销。
答案 1 :(得分:2)
是的可能。您可以将代码添加到路径文件中,如:
%{ if (play.mode.isDev()) { }%
GET /route4 Application.noProd
GET /route5 Application.noProd
GET /route6 Application.noProd
%{ } }%
本网站上解释了所有内容:http://playframework.wordpress.com/2011/07/15/hidden-features-of-the-play-framework-routes-file/
答案 2 :(得分:0)
我只是成功地将其设置为:
%{ if (play.id.equals("test")) { }%
GET /testme Test.index
%{ } }%
所以只有在你运行“游戏测试”时才会存在路线,这是更具体的。
另外,我将控制器Test放在../test/controllers/上,因此在生产模式下不存在。 不知何故,我不得不将我的观点/ Test / index.html放在... / app中,因为它无法在... / test中找到,这很奇怪,因为控制器是 .../测试。我可能会为此提出一个问题,但我不会因为Play2已经很久了。
答案 3 :(得分:0)
隐藏测试控制器和视图的另一种方法是将它们移动到测试目录。 只需在测试文件夹中创建一个控制器包,例如:
public class TestController extends Controller {
public static void show() {
renderTemplate("/test/views/Test/show.html");
}
}
因此,除了测试之外,您可以保持全部路线并且您的TestController永远不会以公共模式公开。