我的问题的答案可能非常简单和愚蠢,但到目前为止,我自己找不到它。使用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]
谢谢!
我的配置几乎是全新的。我使用了activator命令行来创建项目并生成构思配置文件。这是我目前的文件夹结构(我只列出运行集成测试时缺少的那些):
app >>
assets >>
javascripts >>
app.js
public >>
stylesheets >>
style.css
images >>
favicon.ico
当我使用命令行
运行测试时,一切正常activator test
由于我还没有找到解决方案,我在配置上提供了更多代码和信息,所以也许有人会发现问题。
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"
)
我再次更新了我的帖子以反映我当前的项目结构和代码(见上文)。我修改了我的代码以使用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文件),除非它解决了我的问题,否则我不想这样做直到我真的需要它。有什么想法吗?
答案 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
干杯!