在yeoman生成的应用程序中为API调用提供存根

时间:2013-07-09 06:23:48

标签: gruntjs yeoman stubbing

我一直在尝试为使用yeoman生成的应用创建api存根。这里没什么特别的,我只是打电话:

mkdir demo1 
cd demo1
yo angular

出于开发目的,我需要api存根,到目前为止我发现的唯一模块是lineman。但是,就我所知,lineman不是非常 yeoman-friendly ,所以我所做的是在端口8000上启动lineman,提供一些api存根(就像文档中的那些) ),并将"grunt-connect-proxy": "~0.1.5"添加到项目节点模块,然后创建一个代理,将所有localhost:9000/api/*传递给localhost:8000/api/*,从而提供存根。

虽然这样做有效,但我想删除有线人依赖关系并自己提供存根。这是我到目前为止编写的代码(添加express作为路由/参数解析的依赖) - 大多数代码都是bit&来自快递模块的片段,以便将http.ServerRequesthttp.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& amp;的初学者。节点模块。

任何帮助都可以,谢谢。

2 个答案:

答案 0 :(得分:1)

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可能是。

答案 1 :(得分:0)

这两个端口配置为相同的上下文,尝试更改为:localhost:9000 / *和localhost:8000 / api / *。 这些上下文和端口是在Gruntfile中配置的吗?