使用Grunt模拟端点

Abr*_*m P 11 rest mocking angularjs gruntjs yeoman

我正在使用Yeoman,Grunt和Bower构建一个独立于后端构建前端的平台.我的想法是,我的所有(AngularJS)控制器,服务,工厂等都存在于这个项目中,然后根据grunt构建的结果注入我的服务器端代码库.

我的问题是:

我如何模拟端点,以便Grunt服务器响应与我的(Rails)应用程序相同的端点?

目前我正在使用:

 angular.module('myApp', ['ngResource'])

 .run(['$rootScope', function ($rootScope) {
     $rootScope.testState = 'test';
  }]);
Run Code Online (Sandbox Code Playgroud)

然后在我的每个服务中:

   mockJSON = {'foo': 'myMockJSON'}
Run Code Online (Sandbox Code Playgroud)

并在每个方法:

   if($rootScope.testState == 'test'){
    return mockJSON;
  }
  else {
    real service logic with $q/$http goes here
  }
Run Code Online (Sandbox Code Playgroud)

之后grunt build,testState = 'test'被删除.

这显然是一个相对笨拙的架构.我怎么能避免呢?我如何让Grunt响应与我的应用程序相同的端点(其中一些有动态参数)应用一些逻辑(如果需要),并提供一个json文件(可能依赖于路径参数)?

Abr*_*m P 14

我已经通过使用express来编写一个用静态json响应的服务器来解决这个问题.

首先,我在我的项目中创建了一个名为'api'的目录.在该目录中,我有以下文件:

package.json:

   {
     "name": "mockAPI",
     "version": "0.0.0",
     "dependencies": {
        "express": "~3.3.4"
      }
   }
Run Code Online (Sandbox Code Playgroud)

然后我npm install在这个目录中运行.

index.js:

    module.exports = require('./lib/server');
Run Code Online (Sandbox Code Playgroud)

lib/server.js:

    express = require('express');
    var app = express();

    app.get('/my/endpoint', function(req, res){
        res.json({'foo': 'myMockJSON'});
   });

    module.exports = app
Run Code Online (Sandbox Code Playgroud)

最后在我的全球Gruntfile.js:

         connect: {
            options: {
               port: 9000,
               hostname: 'localhost',
            },
            livereload: {
              options: {
                 middleware: function (connect, options) {
                   return [
                     lrSnippet,
                     mountFolder(connect, '.tmp'),
                     mountFolder(connect, yeomanConfig.app),
                     require('./api')
                   ];
               }
            }
         },
Run Code Online (Sandbox Code Playgroud)

然后服务发出请求,快速服务器提供正确的JSON.

之后grunt build,快速服务器只需替换为rails服务器.

  • @pablomolnar我编写的插件(下面的答案)允许您在dev服务器仍在运行时修改模拟响应.http://stackoverflow.com/a/25714447/895309 (2认同)

Wol*_*ang 8

grunt-contrib-connectv.0.7.0开始,您还可以将自定义中间件添加到现有中间件堆栈,而无需手动重建现有的中间件堆栈.

livereload: {
    options: {
        open: true,
        base: [
            '.tmp',
            '<%= config.app %>'
        ],
        middleware: function(connect, options, middlewares) {
            // inject a custom middleware into the array of default middlewares
            middlewares.push(function(req, res, next) {
                if (req.url !== '/my/endpoint') {
                    return next();
                }
                res.writeHead(200, {'Content-Type': 'application/json' });
                res.end("{'foo': 'myMockJSON'}");
            });
            return middlewares;
        }
    }
},
Run Code Online (Sandbox Code Playgroud)

有关官方文档,请参阅https://github.com/gruntjs/grunt-contrib-connect#middleware.