Обеспечьте заглушки для вызовов API в приложении, созданном йоменом.

Я пытался создать заглушки API для приложения, созданного с помощью yeoman. Здесь ничего особенного, я просто позвонил:

mkdir demo1 
cd demo1
yo angular

Для целей разработки мне нужны заглушки API, и единственный модуль, который я нашел до сих пор, который делает это, — это монитор. Однако, насколько я могу судить, лайнман не очень удобен для йоменов, поэтому я запустил лайнмана на порту 8000, предоставил несколько заглушек API (таких как в документации) и добавил "grunt-connect-proxy": "~0.1.5" для проецирования узловых модулей, затем создал прокси, который передал все localhost:9000/api/* в localhost:8000/api/*, таким образом предоставляя заглушки.

Пока это работает, я хотел бы удалить зависимость от обходчика и сам предоставить заглушки. Это код, который я написал до сих пор (добавлено express в качестве зависимости для анализа маршрутизации/параметров) - большая часть кода представляет собой фрагменты из экспресс-модулей, чтобы обернуть http.ServerRequest и http.ServerResponse в экспресс-модули request и response:

// load all grunt tasks
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);

var drawRoutes = require('./config/server').drawRoutes;
var express = require('express');
var expressApp = express();
drawRoutes(expressApp);
var router = expressApp._router;

// Provide api stubs through express router functionality.
var apiStubSnippet = function(req, res, next) {
  var match = router.matchRequest(req);
  if (typeof(match) !== 'undefined') {
    // Found a match, invoke it
    if (match.callbacks.length > 0) {

      var _req = require('express/lib/request');
      var _resp = require('express/lib/response');

      // Set the two objects together ... but why?!
      _req.__proto__ = req;
      _req.app = expressApp;
      _req.res = _resp;

      _resp.__proto__ = res;
      _resp.app = expressApp;
      _resp.req = _req;

      match.callbacks[0](_req, _resp);
    }
  } else {
    // No match on the router, go next.
    next();
  }
};

На данный момент вызовы кажутся разрешенными (ошибок в консоли больше нет). Но звонки остаются в ожидании, и я не знаю, что делать дальше. Я почти уверен, что код слишком сложен для того, что ему нужно делать, но я новичок в модулях grunt и node.

Любая помощь будет делать, спасибо.


person Alex Dobjanschi    schedule 09.07.2013    source источник


Ответы (2)


Angular позволяет заглушить с помощью $httpBackend, вы пробовали это?

Мне нравится нарушать лучшие практики JS, когда это возможно, поэтому вот что я сделал для проекта в начале этого года:

app.run(function ($httpBackend) {
  var createResponse = function (type, url, status, response) {
    var when = $httpBackend.when(type, url);
    if (angular.isDefined(status) && angular.isDefined(response))
      when.respond(status, response);
    return when;
  };

  String.prototype.get =
  RegExp.prototype.get = function (status, response) { return createResponse('GET', this, status, response); };

  String.prototype.post =
  RegExp.prototype.post = function (status, response) { return createResponse('POST', this, status, response); };

  String.prototype.put =
  RegExp.prototype.put = function (status, response) { return createResponse('PUT', this, status, response); };

  /^\/views\//
    .get()
    .passThrough();

  '/api/login'
    .post(200, {
      // response object.
    });
});

Этот конкретный подход может быть не тем, что вам нужно, однако $httpBackend, вероятно, вам подходит.

person Stephen    schedule 09.07.2013
comment
Спасибо за ответ. Чего я действительно хочу, так это не изменять клиентский код. Конечно, вы можете имитировать xhr в любом объекте службы/контроллера, предоставить другую службу, которая имитирует реальную вещь (именно то, что вы делаете в тестах). Я все еще должен найти решение здесь :). Напишу, если исправлю ошибки. - person Alex Dobjanschi; 11.07.2013
comment
Вы включаете в разработку только модуль $httpBackend. Он разработан Angular именно для ваших целей. Я не уверен, почему вы хотели бы пройти через много проблем дальше по стеку, чтобы получить те же результаты. - person Stephen; 11.07.2013
comment
Я бы хотел не менять ни одной строки кода из клиентского приложения, а заглушить базовую реализацию API (т.е. бэкэнд). Все еще не нашел решение, но опубликую здесь, когда решу его (также, если). - person Alex Dobjanschi; 09.08.2013

Два порта настроены для одного и того же контекста, попробуйте изменить на: localhost:9000/* и localhost:8000/api/* . Этот контекст и порты настраиваются в Gruntfile?

person Gelio    schedule 01.10.2013