我们的应用使用jQuery dialogs进行模态弹出窗口。我们正在尝试为我们的javascript编写一些单元测试,其中一部分是创建对话框。我们正在使用Jasmine和Jasmine Maven plugin。在浏览器中运行测试时,一切正常。但是,当我们尝试运行无头执行的测试(mvn jasmine:test
)时,测试会在创建对话框的行上失败。错误看起来像这样:
* TypeError: Cannot find function dialog in object [object Object].
这种情况发生的就是这样:
$(element).dialog(popupProperties);
如果有帮助,我们的pom.xml为插件提供了这个:
<plugin>
<groupId>com.github.searls</groupId>
<artifactId>jasmine-maven-plugin</artifactId>
<version>1.2.0.0</version>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
<configuration>
<preloadSources>
<source>${project.basedir}/src/main/webapp/resources/jquery.js</source>
<source>${project.basedir}/src/main/webapp/resources/jquery-ui.js</source>
<source>${project.basedir}/src/main/webapp/resources/angular.js</source>
<source>${project.basedir}/src/test/javascript/lib/angular-mocks.js</source>
<source>${project.basedir}/src/test/javascript/lib/jasmine-fixture.js</source>
</preloadSources>
<jsSrcDir>${project.basedir}/src/main/webapp/resources/</jsSrcDir>
<jsTestSrcDir>${project.basedir}/src/test/javascript/unit/</jsTestSrcDir>
</configuration>
</plugin>
我们可以做些什么来让无头执行与对话框一起工作吗?
答案 0 :(得分:1)
我们弄清楚问题是什么。基本上我们的src目录中的preloadSources
被添加到spec运行器两次。它首先执行所有preoloadSources
,然后从src目录添加所有内容。因此,jquery.js
在第二个jquery-ui.js
下第二次添加,因此它不知道dialog
是什么。我们通过将pom.xml更改为以下内容来修复它:
<plugin>
<groupId>com.github.searls</groupId>
<artifactId>jasmine-maven-plugin</artifactId>
<version>1.2.0.0</version>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
<configuration>
<preloadSources>
<source>${project.basedir}/src/main/webapp/resources/${ivplugin.client.version}/jquery.js</source>
<source>${project.basedir}/src/main/webapp/resources/${ivplugin.client.version}/jquery-ui.js</source>
<source>${project.basedir}/src/main/webapp/resources/${ivplugin.client.version}/angular.js</source>
<source>${project.basedir}/src/test/javascript/lib/angular-mocks.js</source>
<source>${project.basedir}/src/test/javascript/lib/jasmine-fixture.js</source>
</preloadSources>
<jsSrcDir>${project.basedir}/src/main/webapp/resources/${ivplugin.client.version}/</jsSrcDir>
<jsTestSrcDir>${project.basedir}/src/test/javascript/unit/</jsTestSrcDir>
<sourceExcludes>
<exclude>**/jquery.js</exclude>
<exclude>**/jquery-ui.js</exclude>
<exclude>**/angular.js</exclude>
</sourceExcludes>
</configuration>
</plugin>
sourceExcludes
阻止它第二次添加。这一切似乎都是插件的一个错误,但这让我们可以绕过它。