3

在这个例子中,我有一个 e2e 测试做一个按钮点击,它执行一个执行 POST 的函数

我希望能够在我的 e2e 场景代码中从 testDev httpBackend 回调访问“数据”对象以进行验证。

这在 e2e 测试中可能吗?如果是这样,你能指出我正确的方向吗?

谢谢

场景代码

describe('test2 app', function() {
    beforeEach(function() {
        browser().navigateTo('/testbed/e2e/app/index2.html');
    });
    it('should run a POST',function() {
        element('#myButton2').click();
    });
});

测试模块

var test2Dev = angular.module('test2Dev', ['test2App', 'ngMockE2E'])
.run(function($httpBackend) {
    $httpBackend.whenPOST(/testpost/)
    .respond(function(method, url, data, headers){
        console.log(data);
        return [200, data, {}];
    });
});

标记

<html lang="en" ng-app="test2Dev" ng-controller="test2Ctrl">
<head>
    <meta charset="utf-8">
    <title>Test click </title>
    <link rel="stylesheet" href="css/app.css">
    <link rel="stylesheet" href="css/bootstrap.css">
    <script src="lib/angular/angular.js"></script>
    <script src="lib/angular/angular-mocks.js"></script>
    <script src="/testbed/e2e/test/e2e/test2Dev.js"></script>
    <script src="js/controllers2.js"></script>
</head>
<body>
    <button id="myButton2" ng-click="runPost()">run post</button>
</body>
</html>

控制器

var test2App = angular.module('test2App', []);
test2App.controller('test2Ctrl', function($scope,$http) {
    $scope.runPost = function() {
        $http.post('/testpost',{
            data1 : 'chevy',
            data2 : 'ford'
        });
    }
});

赛跑者

<!doctype html>
<html lang="en">
  <head>
    <title>End2end Test Runner</title>
    <meta charset="utf-8">
    <base href="../..">
    <script src="app/lib/angular/angular-scenario.js" ng-autotest></script>
    <script src="app/lib/angular/angular-mocks.js" ng-autotest></script>
    <script src="/testbed/e2e/test/e2e/test2Dev.js"></script>
    <script src="/testbed/e2e/test/e2e/scenarios2.js"></script>
  </head>
  <body>
  </body>
</html>
4

1 回答 1

2

不是很漂亮,但我删除了我的测试模块,并在此处使用了“mockApi”的更改版本-> https://github.com/blabno/ngMockE2E-sample (谢谢Bernard Labno)

更改了 e2e.mocks.js 以将数据对象添加到它的配置 obj->

    function setup(method, url, config)
    {
        $httpBackend.when(method, url).respond(function (requestMethod, requestUrl, data, headers) {
            config.triggered = true;
            config.data      = data;
            var response = config.response || {};
            if (config.serverLogic) {
                response = config.serverLogic(requestMethod, requestUrl, data, headers);
            }
            return [response.code || 200, response.data];
        });
    }

    setup(POST, /testpost/, mocks.api.post_test);

....并添加了此方法来访问它....

    chain.getData = function() {
        return this.addFuture("get data object for " + itemName, function(done) {
            done(null,JSON.parse(api[itemName].data));
        });
    };

...这是我现在的场景...

it('should run a POST',function() {
    element('#myButton2').click();
    expect(mockApi("post_test").getData()).toEqual({
        data1 : 'chevy',
        data2 : 'ford'
    });
});

有一个更好的方法吗?

于 2014-04-02T22:06:42.120 回答