3

我们的应用程序将jQuery 对话框用于模态弹出窗口。我们正在尝试为我们的 javascript 编写一些单元测试,其中一部分是创建对话框。我们正在使用 Jasmine 和Jasmine Maven 插件。在浏览器中运行测试时,一切正常。但是,当我们尝试无头执行测试 ( 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>

我们可以做些什么来让无头执行与对话内容一起工作?

4

1 回答 1

1

我们弄清楚了问题所在。基本上,preloadSources来自我们的 src 目录的文件被两次添加到规范运行器中。它会先做所有preoloadSources事情,然后添加 src 目录中的所有内容。因此,jquery.js在 2nd 下添加了 2nd 次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防止它被第二次添加。这一切似乎都是插件的一个错误,但这让我们能够绕过它。

于 2013-02-25T17:17:12.710 回答