unit-testing - angular-mock.js 与 htmlunit 冲突吗?如何在 maven-jasmine 中使用 angular-mock.js 测试 Angular 应用程序

标签 unit-testing angularjs mocking htmlunit jasmine-maven-plugin

我是 maven 和 jasmine 的新手,我在设置 maven 以在 angular 应用程序上运行单元测试时遇到问题。我一加就出问题了angular-mocks.js 到 test/javascript/lib 文件夹。
mvn test抛出 htmlunit.ScriptException只需添加 angular-mocks 文件。如果我删除文件,它运行得很好(当然没有部分依赖于模拟,但它们作为单元测试失败而不是抛出错误)。

有谁知道可能导致此错误的原因以及如何解决?

编辑
我强烈怀疑这是一个 htmlunit 问题,因为更改 <browserVersion> 时错误不同:

Chrome 给出:

TypeError: Cannot find function attachEvent in object [object HTMLDocument]. (http://localhost:55408/src/lib/angular.js#1568)



FIREFOX_3_6 给出:

Exception invoking Node.removeEventListener() with arguments [String, NativeArray, Boolean]



INTERNET_EXPLORER_9 给出:

Exception invoking Node.detachEvent() with arguments [String, NativeArray]



堆栈跟踪(FF 摘录):
[ERROR] Failed to execute goal com.github.searls:jasmine-maven-plugin:1.3.1.2:test (default) on project my-jasmine-project: The jasmine-maven-plugin encountered an exception:
[ERROR] java.lang.RuntimeException: org.openqa.selenium.WebDriverException: com.gargoylesoftware.htmlunit.ScriptException: Exception invoking Node.removeEventListener() with arguments [String, NativeArray, Boolean]
[ERROR] Build info: version: '2.32.0', revision: '6c40c187d01409a5dc3b7f8251859150c8af0bcb', time: '2013-04-09 10:39:28'
[ERROR] System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.8.4', java.version: '1.6.0_51'
[ERROR] Driver info: driver.version: HtmlUnitDriver
[ERROR] at com.github.searls.jasmine.runner.SpecRunnerExecutor.execute(SpecRunnerExecutor.java:39)
...

pom.xml(摘录):
<plugin>
  <groupId>com.github.searls</groupId>
  <artifactId>jasmine-maven-plugin</artifactId>
  <version>1.3.1.2</version>
  <configuration>
    <preloadSources>
      <source>lib/angular.js</source>
      <!-- <source>lib/angular-mocks.js</source> -->
      <source>http://code.angularjs.org/1.1.5/angular-mocks.js</source>
    </preloadSources>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>test</goal>
      </goals>
    </execution>
  </executions>
</plugin>

将 angular-mocks.js 添加到 test/javascript/lib 文件夹并直接从 angularjs 网站引用它都会给出相同的错误。

最佳答案

在 CHROME 浏览器版本中,当 angular 尝试加载 JQLite 时会发生错误,这是一个 jQuery 库的 api 兼容子集,允许 angular 操作 DOM。我能够通过下载未压缩版本的 jQuery (v1.10.2)、angular (v1.0.7) 和 angular-mocks (v1.0.7) 来解决这个问题。我在 jasmine-maven-plugin 的配置中添加了以下内容。

<preloadSources>
  <preloadSource>${angular-test-deps}/jQuery.js</preloadSource>
  <preloadSource>${angular-test-deps}/angular.js</preloadSource>
  <preloadSource>${angular-test-deps}/angular-mocks.js</preloadSource>
</preloadSources>

angular 文档指出“真正的 jQuery 总是优先于 jqLit​​e,前提是它在 DOMContentLoaded 事件触发之前加载”(未压缩 1.0.7 的第 1448 行)。此修复对于 CHROME 浏览器版本仍然失败,但适用于 FIREFOX_3_6、FIREFOX_17、INTERNET_EXPLORER_9、INTERNET_EXPLORER_8 和 INTERNET_EXPLORER_7。 jasmine-maven-plugin 默认为 FIREFOX_3_6 浏览器版本,因此无需指定浏览器版本。

关于unit-testing - angular-mock.js 与 htmlunit 冲突吗?如何在 maven-jasmine 中使用 angular-mock.js 测试 Angular 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17675261/

相关文章:

java - 在 jmockit 中模拟被测类的私有(private)方法

java - 模拟 Sftp 类跳过方法调用

inheritance - 如何使用 gmock 模拟调用基类

c# - 在 vnext 应用程序中测试 IActionResult 内容

javascript - 为什么 Angular ng-src 使我的图像加倍?

javascript - AngularJS 客户端 MVC 模式?

javascript - 谷歌登录/第三方身份验证提供商

java - Mockito的ArgumentCaptor : One method name, 两个方法定义(二)

java - 测试 StarTeam 操作

java - Hibernatemock 的文档或教程?