Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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
Javascript ngMock在预期请求时抱怨意外请求_Javascript_Angularjs_Unit Testing_Ngmock - Fatal编程技术网

Javascript ngMock在预期请求时抱怨意外请求

Javascript ngMock在预期请求时抱怨意外请求,javascript,angularjs,unit-testing,ngmock,Javascript,Angularjs,Unit Testing,Ngmock,我的ng应用程序运行良好,但我正在尝试为我的控制器编写一个ngMock测试;我基本上遵循angular网站上的示例:$httpBackend 我遇到的问题是,即使在预期请求时,它也会抱怨意外请求 PhantomJS 1.9.8(Windows 8 0.0.0)通知控制器应获取通知列表失败 错误:意外请求:GET对testsapi/AspNetController/AspNetAction无效 预期获取api/AspNetController/AspNetAction 我不明白的是,在错误行中,为

我的ng应用程序运行良好,但我正在尝试为我的控制器编写一个ngMock测试;我基本上遵循angular网站上的示例:$httpBackend

我遇到的问题是,即使在预期请求时,它也会抱怨意外请求

PhantomJS 1.9.8(Windows 8 0.0.0)通知控制器应获取通知列表失败

错误:意外请求:GET对testsapi/AspNetController/AspNetAction无效 预期获取api/AspNetController/AspNetAction

我不明白的是,在错误行中,为什么在我的服务url之前附加了一个“tests”字? 我认为它应该发送到“api/AspNetController/AspNetAction” 我做错了什么。我在谷歌上找不到其他人遇到和我一样的问题

编辑:我注意到,如果我从我的控制器中删除sendRequest部分,并在控制台中记录我的请求对象的单元测试,我会看到以下json

这是控制器代码

angular.module('MainModule')
    .controller('NotificationsController', ['$scope', '$location', '$timeout', 'dataService',
        function ($scope, $location, $timeout, dataService) {
            //createRequest returns a request object
            var fetchNotificationsRequest = dataService.createRequest('GET', 'api/AspNetController/AspNetAction', null);
            //sendRequest sends the request object using $http
            var fetchNotificationsPromise = dataService.sendRequest(fetchNotificationsRequest);
            fetchNotificationsPromise.then(function (data) {
                //do something with data.
            }, function (error) {
                alert("Unable to fetch notifications.");
            });
    }]
);
测试代码

describe('NotificationsController', function () {
    beforeEach(module('MainModule'));
    beforeEach(module('DataModule')); //for data service

    var $httpBackend, $scope, $location, $timeout, dataService;

    beforeEach(inject(function ($injector) {

        $httpBackend = $injector.get('$httpBackend');

        $scope = $injector.get('$rootScope');
        $location = $injector.get('$location');
        $timeout = $injector.get('$timeout');
        dataService = $injector.get('dataService');

        var $controller = $injector.get('$controller');

        createController = function () {
            return $controller('NotificationsController', {
                '$scope': $scope,
                '$location': $location,
                '$timeout': $timeout,
                'dataService': dataService,
            });
        };
    }));

    afterEach(function () {
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    });

    it('should fetch notification list', function () {
        $httpBackend.expectGET('api/AspNetController/AspNetAction');        //this is where things go wrong
        var controller = createController();

        $httpBackend.flush();
    });

});
数据服务代码

    service.createRequest = function(method, service, data) {
        var req = {
            method: method, //GET or POST
            url: someInjectedConstant.baseUrl + service,
            headers: {
                'Content-Type': 'application/json'
            }
        }

        if (data != null) {
            req.data = data;
        }

        return req;
    }

    service.sendRequest = function (req) {
        return $q(function (resolve, reject) {
            $http(req).then(function successCallback(response) {
                console.info("Incoming response: " + req.url);
                console.info("Status: " + response.status);
                console.info(JSON.stringify(response));

                if (response.status >= 200 && response.status < 300) {
                    resolve(response.data);
                } else {
                    reject(response);
                }
            }, function failCallback(response) {
                console.info("Incoming response: " + req.url);
                console.info("Error Status: " + response.status);
                console.info(JSON.stringify(response));

                reject(response);
            });
        });
    }
service.createRequest=函数(方法、服务、数据){
var req={
方法:方法,//GET或POST
url:someInjectedConstant.baseUrl+服务,
标题:{
“内容类型”:“应用程序/json”
}
}
如果(数据!=null){
req.data=数据;
}
返回请求;
}
service.sendRequest=功能(req){
返回$q(函数(解析、拒绝){
$http(req).then(函数成功回调(响应){
控制台信息(“传入响应:+req.url”);
控制台信息(“状态:+响应状态”);
console.info(JSON.stringify(response));
如果(response.status>=200&&response.status<300){
解析(response.data);
}否则{
拒绝(回应);
}
},函数失败回调(响应){
控制台信息(“传入响应:+req.url”);
控制台信息(“错误状态:+响应状态”);
console.info(JSON.stringify(response));
拒绝(回应);
});
});
}
答复:

由于dataService通过someInjectedConstant.baseUrl+从controller传入的任何相对url创建了最终的webapi url,因此在我编写的测试中,我必须注入someInjectedConstant

$httpBackend.expectGET(someInjectedConstant.baseUrl+relativeUrl)

而不仅仅是执行$httpBackend.expectGET(relativeUrl)


显然,
对测试无效
在代码中的某个地方添加了url前缀。它也没有添加硬编码域(参见下面的注释)。检查您的所有代码以及可能将其添加到url的测试管道的任何其他部分

关于代码的几点:

  • 避免在代码中硬编码域名(我看你在更新的答案中已经解决了这个问题)
  • 也许
    someInjectedConstant
    可以更明确地命名
  • 您无需使用
    $q
    包装
    $http
    ,因此
    服务。sendRequest
    可以是:

    service.sendRequest = function (req) {
        $http(req).then(function (response) { // no need to name the function unless you want to call another function with all success/error code in defined elsewhere
            console.info("Incoming response: " + req.url);
            console.info("Status: " + response.status);
            console.info(JSON.stringify(response));
            return response.data; // angular treats only 2xx codes as success
        }, function(error) {
            console.info("Incoming response: " + req.url);
            console.info("Error Status: " + response.status);
            console.info(JSON.stringify(response));
        });
    }
    

很明显,
对测试无效
正在代码中的某个地方添加url前缀。它也没有添加硬编码域(参见下面的注释)。检查您的所有代码以及可能将其添加到url的测试管道的任何其他部分

关于代码的几点:

  • 避免在代码中硬编码域名(我看你在更新的答案中已经解决了这个问题)
  • 也许
    someInjectedConstant
    可以更明确地命名
  • 您无需使用
    $q
    包装
    $http
    ,因此
    服务。sendRequest
    可以是:

    service.sendRequest = function (req) {
        $http(req).then(function (response) { // no need to name the function unless you want to call another function with all success/error code in defined elsewhere
            console.info("Incoming response: " + req.url);
            console.info("Status: " + response.status);
            console.info(JSON.stringify(response));
            return response.data; // angular treats only 2xx codes as success
        }, function(error) {
            console.info("Incoming response: " + req.url);
            console.info("Error Status: " + response.status);
            console.info(JSON.stringify(response));
        });
    }
    

请发布您的数据服务和asp routehandler代码好吗?最有可能的是,“测试”是在其中一项测试中预先准备好的those@br3w5,我为dataservice添加了代码,asp路由只是标准的;点击将显示我需要的json数据。在这个阶段,没有使用身份验证。我在更改端点时也遇到过类似的问题,但这一点更清楚,并且被现有的测试所捕获……您不应该对
/api/AspNetController/AspNetAction
(注意第一个斜线)?@br3w5好的,数据服务将该斜线与域(本地主机)一起附加在一起吗. 有趣的是,该应用程序运行完全正常,但单元测试却在抱怨。我最初使用的是jasmine spy,他在解析该端点的模拟数据时没有问题,但由于与作用域相关的问题,我切换了ngMock。@br3w5,我刚刚对我的帖子进行了编辑。如果我不发送$http请求,并尝试将请求对象记录到日志中,则它会自己发送。我注意到创建时请求对象中的url错误。请发布您的数据服务和asp routehandler代码好吗?最有可能的是,“测试”是在其中一项测试中预先准备好的those@br3w5,我为dataservice添加了代码,asp路由只是标准的;点击将显示我需要的json数据。在这个阶段,没有使用身份验证。我在更改端点时也遇到过类似的问题,但这一点更清楚,并且被现有的测试所捕获……您不应该对
/api/AspNetController/AspNetAction
(注意第一个斜线)?@br3w5好的,数据服务将该斜线与域(本地主机)一起附加在一起吗. 有趣的是,该应用程序运行完全正常,但单元测试却在抱怨。我最初使用的是jasmine spy,他在解析该端点的模拟数据时没有问题,但由于与作用域相关的问题,我切换了ngMock。@br3w5,我刚刚做了一个e