【问题标题】:Angular e2e tests affecting database影响数据库的 Angular e2e 测试
【发布时间】:2013-12-11 12:05:34
【问题描述】:

这是我的问题,一步一步来 :)) 我认为这样读起来更好,不像一堵文字墙可怜地试图解释我的特定领域的问题。

1) 我们有一个Angular.js 应用程序,带有PHP 后端支持MongoDB 存储。

2) Protractor 用于端到端测试。

3) 需要测试更改数据库的页面,即注册场景 - 我正在测试中完成所有注册步骤,因此数据库获得了新的用户记录。

4) 可以预见,测试在运行后会失败,因为数据库有测试用户的记录并且不需要注册 - 用户被重定向到主页。

我想为node.js 获取一个mongodb 包,并在测试中与数据库交互。
但这似乎并不正确:数据库连接的配置文件位于后端的 php 文件中,而我正在尝试为我们应用程序的纯前端部分编写测试。

有什么想法吗?

【问题讨论】:

  • 你想在这里测试什么?隔离测试的目标很重要。如果您的目标是 AngularJS 项目的 E2E 测试,您可以使用 docs.angularjs.org/api/ngMockE2E.$httpBackend 模拟 HTTP 交互。
  • 不幸的是,量角器测试中没有可用的inject 函数,因此您不能像在 Karma 单元测试中那样注入 $httpBackend 模拟。 :(
  • 如果你在谈论嘲笑任何东西,你显然不理解“端到端”的概念。这些是验收测试,应该正是最终用户的体验。我不知道有任何个应用程序的最终用户将模拟库注入到我的代码中。

标签: angularjs testing webdriver protractor angularjs-e2e


【解决方案1】:

有一种简单的方法可以做到这一点。如果您的应用中有与后端对话的 Angular 服务,您可以从量角器调用它。

这是一个例子:

https://github.com/andresdominguez/protractor-meetup/blob/master/test/e2e/api-helper.js

function createObject(data) {
  return browser.executeAsyncScript(function(data, callback) {
    var api = angular.injector(['ProtractorMeetupApp']).get('apiService');
    api.member.save(data, function(newItem) {
      callback(newItem._id);
    });
  }, data);
}

此代码将被序列化并在浏览器上执行。我在 ProtractorMeetupApp 模块中有一个名为 apiService 的服务。 api服务可以创建、更新等。

您的测试将如下所示:

https://github.com/andresdominguez/protractor-meetup/blob/master/test/e2e/member3-spec.js

it('should call api', function() {
  // Create a new member.
  createObject({name: 'test member'}).then(function(id) {
    console.log(id)
  });
});

【讨论】:

    【解决方案2】:

    我会模拟与您的 PHP 应用程序的交互。这将允许您将测试隔离到 Angular 代码并更明确地测试数据中的边缘情况(或服务器端的问题)。 http://docs.angularjs.org/api/ngMockE2E.$httpBackend

    这是另一个可能对您有帮助的答案:mock $httpBackend in angular e2e tests

    【讨论】:

    • 嘿,选民,为什么不添加一些你认为问题所在的 cmets?
    • 如果你是在嘲笑,那它就不再是一个端到端的测试了。这只是集成测试的另一种形式。这不是 OP 想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2013-08-01
    相关资源
    最近更新 更多