如何在无头执行期间测试jQuery UI Dialog

时间:2013-02-20 16:09:45

标签: javascript unit-testing jquery-ui-dialog jasmine jasmine-maven-plugin

我们的应用使用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>

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

1 个答案:

答案 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阻止它第二次添加。这一切似乎都是插件的一个错误,但这让我们可以绕过它。