Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何使用Angular/Karma/Jasmine正确测试put(或post)请求?_Angularjs_Unit Testing_Prestashop_Karma Jasmine - Fatal编程技术网

Angularjs 如何使用Angular/Karma/Jasmine正确测试put(或post)请求?

Angularjs 如何使用Angular/Karma/Jasmine正确测试put(或post)请求?,angularjs,unit-testing,prestashop,karma-jasmine,Angularjs,Unit Testing,Prestashop,Karma Jasmine,我正在为一个带有Angular的应用程序使用webservices。我确实“收到”了请求,并用Karma/Jasmine进行了如下测试: beforeEach(module('webservices')); beforeEach(inject(function(_$httpBackend_) { $httpBackend = _$httpBackend_; jasmine.getJSONFixtures().fixturesPath='base/tests/json/api';

我正在为一个带有Angular的应用程序使用webservices。我确实“收到”了请求,并用Karma/Jasmine进行了如下测试:

beforeEach(module('webservices'));
beforeEach(inject(function(_$httpBackend_) {

    $httpBackend = _$httpBackend_;
    jasmine.getJSONFixtures().fixturesPath='base/tests/json/api';

    // Customers
    $httpBackend.when('GET', 'http://prestashop/api/customers/1?ws_key=key&output_format=JSON')
    .respond(getJSONFixture('customers/1.json'));
    $httpBackend.when('GET', 'http://prestashop/api/customers/2?ws_key=key&output_format=JSON')
    .respond(getJSONFixture('customers/2.json'));
    $httpBackend.when('PUT', 'http://prestashop/api/customers/1?ws_key=key&output_format=JSON')
    .respond(getJSONFixture('customers/1.json'));
}));

it("\n\ngets firstname about customer 1", function(){

    angular.mock.inject(function (Customer) {

        var client;

        Customer.get(1).success(function(data, status, headers, config){
            client = data;
        }). error(function(data, status, headers, config) { });

        $httpBackend.flush();
        expect(client.customer.firstname).toBe('John');
    });
});
它工作得很好。 现在,我想测试一个PUT方法(以及POST方法之后)。但是,我没有找到正确的方法

我最后一次尝试是:

    it("\n\nputs a different firstname, lastname, email, passwd about customer 1", function(){

        angular.mock.inject(function (Customer) {

            var idCustomer = 3;
            var firstname = 'Pierre', 
            lastname = 'Stan', 
            passwd = 'mdp', 
            email = 'pierrre.stan@test.fr';

            var client =    {customer: {id: idCustomer, 
                                        firstname: firstname, 
                                        passwd: passwd, 
                                        lastname: lastname, 
                                        email: email
                                        }
                            };

            var clientReturn;

            Customer.put(idCustomer, client).success(function(data, status, headers, config){
                clientReturn = data;
            }). error(function(data, status, headers, config) { });

            $httpBackend.flush();
            expect(clientReturn .customer.fistname).toBe('Pierre');
        });
    });
但返回的是旧数据。我花了很多时间来寻找正确的测试方法,但什么也没找到

Mu工厂:

var webservices = angular
.module('webservices', []);

webservices.factory('Customer', ['$http', function($http){

    var baseDir = "http://prestashop/api";    
    var customerDir = "/customers";
    var keyDir = "?ws_key=key";
    var formatDir = "&output_format=JSON";

    return {
        get: function(id) {
            var urlDir = baseDir + customerDir + "/" + id + keyDir + formatDir;
            return $http.get(urlDir);
        },
        put: function(id, data) {
            var urlDir = baseDir + customerDir + "/" + id + keyDir + formatDir;
            return $http.put(urlDir, data);
        },
        post: function(data) {
            var urlDir =  baseDir + customerDir + keyDir + formatDir;
            return $http.post(urlDir, data);
        }
    };
}]);

在进行测试时,
$httpBackend
只是一个简单的模拟。所有真正的功能都关闭了。这个模拟的
$httpBackend
所做的唯一一件事就是有方法来验证您的请求

当您执行以下操作时:

$httpBackend.when('PUT', url).respond(....);
它并不是真的对任何集合进行任何真正的“放置”。你只是说:嘿,当一个PUT请求发生时,请用X回应。它不会对任何资源进行PUT,它只是一种知道PUT已经完成的方式,而不是其他方式

作为一个示例,您应该在测试中执行而不是操作,下面是一个模拟PUT:

$httpBackend.whenPUT(/^\/api\/todos\/\d+$/).respond(function(method, url, data, headers) {
  var item = JSON.parse(data);
  for (var i = 0, l = things.length; i < l; i++) {
    if (things[i].id === item.id) {
      things[i] = item;
      break;
    }
  }

  return [200, item];
});
$httpBackend.whenPUT(/^\/api\/todos\/\d+$/).respond(函数(方法、url、数据、标题){
var item=JSON.parse(数据);
for(var i=0,l=things.length;i
请参见如何使用我所放置的内容更新“things”集合

因此,对于刚才所做的测试,不需要PUT返回Pierre修改过的数据源,只需确保调用已完成,而无需其他操作

我建议您从
。when
切换到
。expect
,因此,如果您期望调用
Customer.put
将执行该“put”请求,则如果从未执行该请求,测试将失败


所以这里的问题是,不要忘记在测试中需要做什么,你并不需要更新你的资源,只需要点击不同的端点。

谢谢你的回答。我就是这么想的。所以,这种测试的兴趣非常小,不是吗?不是真的,你需要测试它们。您需要确保HTTP调用正在进行,而没有其他操作(关于HTTP)。好的,很好。感谢您将application/x-www-form-urlencoded字符串转换为对象签出