java - Assets 未在功能测试模式下加载

标签 java selenium intellij-idea playframework playframework-2.3

我的问题的答案可能非常简单和愚蠢,但到目前为止我自己找不到。使用 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/

相关文章:

java - Lucene 6.0!如何实例化 BooleanQuery 并在其中添加其他搜索查询?

java - MigLayout - componentResized() 调用次数过多

java - 您可以使用 Selenium Webdriver 在 Firefox 启动后延迟测试启动吗?

java - 如何在selenium中找到具有相同xpath的匹配元素的匹配长度

intellij-idea - Intellij IDEA 生成 for-each/for 键盘快捷键

maven - websocket 不能在 tomcat 8 上工作

intellij-idea - Intellij IDEA 15 中的持久化工具窗口在哪里?

java - 如何对 Java 软件进行商业许可?

java - 无法解析导入 com.perfectomobile.selenium

java - 'pure' MVC 实现有多有用?