资产未在功能测试模式下加载

时间:2014-07-16 22:36:44

标签: java selenium intellij-idea playframework playframework-2.3

我的问题的答案可能非常简单和愚蠢,但到目前为止,我自己找不到它。使用Play Framework,emberjs和FluentLenium,我写了一个非常简单的功能测试,但不能使它在 IntelliJ IDEA 13 下工作。出于某种原因,当我使用IntelliJ运行测试时,位于 public /和app / 文件夹中的每个资产找不到

这是我的代码:

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]

谢谢!

UPDATE:

我的配置几乎是全新的。我使用了activator命令行来创建项目并生成构思配置文件。这是我目前的文件夹结构(我只列出运行集成测试时缺少的那些):

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>

plugins.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")

build.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:

我再次更新了我的帖子以反映我当前的项目结构和代码(见上文)。我修改了我的代码以使用WebJars而不是手动下载的js libs,按照迁移到Play 2.3.X的步骤,更新到上一个Play版本并按照步骤正确导入SBT&amp;在Play文档中指定的IntelliJ中播放项目。现在,当我从IntelliJ运行我的测试时,我仍然得到相同的错误但是,我可以看到在target /包含文件夹test /中包含生成的web /文件夹,其中包含我在项目中具有正确文件夹结构的每个资源。我在IntelliJ中将此文件夹添加为资源/测试资源文件夹,但仍然没有成功。我还添加了我的公共文件夹,结果相同。

我真的觉得我越来越接近解决方案了。事实上,我尝试了很多东西,发现如果我删除sbt-rjs插件(这是RequireJS),在dev(激活器运行)中运行代码时会出现相同的错误。我没有为我的JS文件设置RequireJS(添加main.js文件),除非它解决了我的问题,否则我不想这样做直到我真的需要它。有什么想法吗?

4 个答案:

答案 0 :(得分:7)

最后,这是解决这个问题的方法。

我将此行添加到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的出色评论,他们为我提供了这个解决方案!

答案 1 :(得分:1)

我最近遇到了类似的问题。我解决了它根据Play 2.3 Migration guide:

仔细检查这些步骤

1.-检查/project/build.properties文件中是否将sbt.version设置为0.13.5。

2.-在project / plugins.sbt文件中添加sbt-web插件: addSbtPlugin(“com.typesafe.sbt”%“sbt-web”%“1.0.2”)

3.-在/build.sbt文件中启用SbtWeb插件,如下所示 lazy val root =(项目在文件中(“。”))。enablePlugins(PlayJava,SbtWeb)

如果这解决了您的问题,请告诉我。

答案 2 :(得分:1)

对于正在寻求解决方案的其他人,我们在使资产在Scala 2.12和Play Framework 2.6下运行的功能测试中无法正确加载时遇到了问题。根据此处接受的答案的建议,我们尝试添加:

unmanagedResourceDirectories in FunctionalTest += 
  baseDirectory ( _ /"target/web/public/test" ).value

似乎可以正常工作-至少在本地。但是,在CI方面,一切仍然失败。这里还提到了一个旧的Play框架问题:https://github.com/playframework/playframework/issues/3234,我们在运行功能测试套件之前尝试添加了web-test:assets命令,并且还出现了来对其进行了修复正如我们在本地看到的那样,资产已移至target/web/public/test目录中。尽管在CI方面始终如一地通过还是通过仍然存在问题。

知道sbt-web参与了此过程,回到sbt-web文档中,https://github.com/sbt/sbt-web的自述文件中有一个小隐藏项目:

  

要将自动生产就绪的资产自动添加到类路径中,以下操作可能会有用:

     
(managedClasspath in Runtime) += (packageBin in Assets).value

稍微修改该行以使用我们的FunctionalTest配置:

(managedClasspath in FunctionalTest) += (packageBin in Assets).value

现在它正在本地和配置项上通过 ALL TIME 。无需其他SBT行,我们删除了

unmanagedResourceDirectories in FunctionalTest +=
  baseDirectory ( _ /"target/web/public/test" ).value

行,因为它不再需要。

答案 3 :(得分:0)

你遇到的问题并不新鲜,请看这里:

Static resources not found in (Selenium) JUnit test for Play 2.0 application executed from Eclipse

我要做的就是克服这个问题很简单(Eclipse示例)

public abstract class RunInBrowserTest extends FluentTest {
    private static boolean isTestRunningInEclipse = true;
    static {
        if (System.getenv("PLAY_HOME") != null) {
            isTestRunningInEclipse = false;
        };
    }

    @BeforeClass
    public static void startApp() throws Exception {
        if (!isTestRunningInEclipse) {
            server = play.test.Helpers.testServer(port);
            server.start();
        }
    }
}

“扩展FluentTest”将允许您直接在测试类中使用“goTo(url)”和“$(#blah).click”以及整个FluentLenium api。

另外,请确保在环境变量中设置PLAY_HOME,这实际上就是诀窍。

如果要在Eclipse中启用运行功能测试,

首先转到您的控制台并输入play run

现在您可以按下Eclipse中的播放按钮,您的功能测试将毫无问题地运行。

如果您想获得功能测试的javascript报道,请查看jscover-sbt-plugin:

https://github.com/g00dnatur3/jscover-sbt-plugin

干杯!