7

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

谢谢!

更新:

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

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:

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

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

4

4 回答 4

8

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

我将此行添加到我的 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 的精彩评论,他们让我接受了这个解决方案!

于 2014-07-31T06:05:52.140 回答
3

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

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

似乎奏效了——至少在本地是这样。然而,在我们的 CI 方面,事情仍然失败。在另一条评论中提到的是这个旧的 Play Framework 问题:https ://github.com/playframework/playframework/issues/3234 ,我们尝试web-test:assets在运行我们的功能测试套件之前添加命令,这似乎也解决了它,因为我们可以在本地看到资产已移动到target/web/public/test目录中。尽管让它在我们的 CI 方面始终通过或完全通过,但仍然存在问题。

知道这sbt-web涉及到这个过程,回顾文档,在https://github.com/sbt/sbt-websbt-web上的自述文件中有一个隐藏的项目:

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

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

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

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

现在它一直在本地和 CI 上通过不需要其他 SBT 线路,我们删除了

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

线,因为它不再需要。

于 2019-01-25T14:12:11.090 回答
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 插件,就像这个惰性 val root = (project in file(".")).enablePlugins(PlayJava, SbtWeb)

让我知道这是否解决了您的问题。

于 2014-07-21T15:43:36.470 回答
0

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

在从 Eclipse 执行的 Play 2.0 应用程序的 (Selenium) JUnit 测试中找不到静态资源

我为克服这个问题所做的事情很简单(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();
        }
    }
}

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

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

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

你首先去你的控制台并输入play run

现在您只需在 Eclipse 中按下播放按钮,您的功能测试就会顺利运行。

如果您想获得功能测试的 javascript 覆盖率,请在此处查看 jscover-sbt-plugin:

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

干杯!

于 2014-07-20T12:55:14.997 回答