我的问题的答案可能非常简单和愚蠢,但到目前为止我自己找不到。使用 Play Framework、emberjs 和 FluentLenium,我编写了一个非常简单的功能测试,但无法使其在 IntelliJ IDEA 13 下运行。出于某种原因,当我使用 IntelliJ 运行测试时,位于 public/和 app/ 文件夹中的每个 assets 都找不到。
这是我的代码:
import org.junit.Test;
import play.libs.F.Callback;
import play.test.TestBrowser;
import play.test.WithApplication;
import static org.fest.assertions.Assertions.assertThat;
import static play.test.Helpers.*;
public class HomePageTest extends FluentTests {
@Test
public void hello_world_test() {
running(testServer(3333, fakeApplication(inMemoryDatabase())), FIREFOX, new Callback<TestBrowser>() {
public void invoke(TestBrowser browser) {
HomePage homePage = new HomePage(browser.getDriver());
homePage.go();
homePage.isAt();
assertThat(browser.pageSource()).contains("Hello world!");
}
});
}
}
public class HomePage extends BaseFluentPage {
public HomePage(WebDriver driver) {
super(driver);
}
@Override
public String getUrl() {
return BASE_URL;
}
@Override
public void isAt() {
await().atMost(TIMEOUT).until(".ember-application").isPresent();
}
}
public abstract class BaseFluentPage extends FluentPage {
protected static final String BASE_URL = "http://localhost:3333/#/";
protected static final int TIMEOUT = 5000;
protected BaseFluentPage(WebDriver driver) {
super(driver);
}
}
这是我在 IntelliJ IDEA 日志中收到的错误消息:
[[36mdebug[0m] application - Unforseen error for lib/jquery/jquery.js at /public
java.lang.RuntimeException: no resource
at controllers.Assets$$anonfun$controllers$Assets$$assetInfoFromResource$1$$anonfun$10.apply(Assets.scala:214) ~[play_2.11-2.3.0.jar:na]
at controllers.Assets$$anonfun$controllers$Assets$$assetInfoFromResource$1$$anonfun$10.apply(Assets.scala:214) ~[play_2.11-2.3.0.jar:na]
at scala.Option.getOrElse(Option.scala:120) [scala-library-2.11.1.jar:na]
at controllers.Assets$$anonfun$controllers$Assets$$assetInfoFromResource$1.apply(Assets.scala:214) ~[play_2.11-2.3.0.jar:na]
at controllers.Assets$$anonfun$controllers$Assets$$assetInfoFromResource$1.apply(Assets.scala:213) ~[play_2.11-2.3.0.jar:na]
谢谢!
更新:
我的配置几乎是全新的。我使用 activator 命令行来创建项目并生成 idea 配置文件。下面是我当前的文件夹结构(我只列出了运行集成测试时丢失的文件夹):
app >>
assets >>
javascripts >>
app.js
public >>
stylesheets >>
style.css
images >>
favicon.ico
当我使用命令行运行测试时一切正常
activator test
更新 2
由于我还没有找到解决方案,我提供了更多关于我的配置的代码和信息,这样也许有人会发现问题。
index.scala.html :
<html>
<head>
<title>Facebook-API</title>
<link rel="stylesheet" media="screen" href="@routes.Assets.at("lib/bootstrap/css/bootstrap.min.css")">
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/style.css")">
<link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
<script src="@routes.Assets.at("lib/jquery/jquery.js")" type="text/javascript"></script>
<script src="@routes.Assets.at("lib/bootstrap/js/bootstrap.min.js")"></script>
<script src="@routes.Assets.at("lib/handlebars/handlebars.js")" type="text/javascript")"></script>
<script src="@routes.Assets.at("lib/emberjs/ember.js")" type="text/javascript"></script>
<script src="@routes.Assets.at("lib/emberjs-data/ember-data.js")" type="text/javascript")"></script>
<script src="@routes.Assets.at("javascripts/app.js")" type="text/javascript")"></script>
</head>
<body>
@ember_content
</body>
</html>
插件.sbt:
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.2")
// web plugins
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.1")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-web" % "1.0.2")
构建.sbt:
name := """facebook-api"""
version := "1.0-SNAPSHOT"
lazy val root = (project in file(".")).enablePlugins(PlayJava, SbtWeb)
scalaVersion := "2.11.1"
libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
javaWs,
"org.webjars" % "bootstrap" % "3.2.0",
"org.webjars" % "jquery" % "2.1.1",
"org.webjars" % "handlebars" % "1.3.0",
"org.webjars" % "emberjs" % "1.5.0",
"org.webjars" % "emberjs-data" % "1.0.0-beta.8"
)
更新 3:
我再次更新了我的帖子以反射(reflect)我当前的项目结构和代码(见上文)。我修改了我的代码以使用 WebJars 而不是手动下载的 js 库,按照迁移到 Play 2.3.X 的步骤,更新到最新的 Play 版本并按照步骤在 Play 文档中指定的 IntelliJ 中正确导入 SBT & Play 项目。现在,当我从 IntelliJ 运行我的测试时,我仍然遇到相同的错误,但是,我可以看到在 target/中生成了一个 web/文件夹,其中包含一个文件夹 test/,其中包含我在我的项目中拥有的具有正确文件夹结构的所有 Assets .我在 IntelliJ 中将此文件夹添加为 Resource/Test Resource 文件夹,但仍然没有成功。我还添加了我的公用文件夹,结果相同。
我真的觉得我离解决方案越来越近了。事实上,我尝试了很多东西,发现如果我删除 sbt-rjs 插件(这是 RequireJS),在 dev 中运行代码(activator run)会崩溃并出现同样的错误。我还没有为我的 JS 文件设置 RequireJS(添加 main.js 文件)并且在我真正需要它之前不想这样做,除非它解决了我的问题。有什么想法吗?
最佳答案
最后,这是这个问题的解决方案。
我将这一行添加到我的 build.sbt 文件中:
对于 SBT 0.x:
unmanagedResourceDirectories in Test <+= baseDirectory ( _ /"target/web/public/test" )
对于 SBT 1.x:
unmanagedResourceDirectories in Test += baseDirectory ( _ /"target/web/public/test" ).value
感谢@MarkVedder 和@JarmoPertman 的精彩评论,是他们让我选择了这个解决方案!
关于java - Assets 未在功能测试模式下加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24791992/