2

我们的应用程序使用jQuery dialogs进行模态弹出。我们正在尝试为javascript编写一些单元测试,其中一部分是创建对话框。我们使用茉莉花和Jasmine Maven plugin。在浏览器中运行测试时,一切正常。但是,当我们尝试运行测试的无头执行(mvn jasmine:test)时,测试在创建对话框的行上失败。有错误看起来是这样的:如何在无头执行期间测试jQuery UI对话框

* 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> 

有什么我们可以做的,以获得与对话的东西无头执行工作?

回答

1

我们想出了问题所在。基本上我们的src目录中的preloadSources被添加两次到spec runner。它会首先完成所有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阻止它获取添加第二个时间。这一切看起来像插件的错误,但这使我们能够避开它。