0

我正在尝试测试控制器做出的响应。当我通过 gunicorn 和 testFramework 运行它时,响应是不同

我的server.py样子如下:

app = Flask(__name__, static_url_path='/pub')
api = Api(app, catch_all_404s=True)

connect('myapp', host='mongomock://localhost')

api.add_resource(IndexController, "/")

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=debug)

我的IndexController样子:

from flask_restful import Resource
from myapp.models.User import User

class IndexController(Resource):
  """
  This controller shows all the Users
  """

  @classmethod
  def get(cls):
    """
    Simple GET call for /
    """
    data = []
    for user in User.objects:
        data.append({
            "name": user.name,
            "location": user.location
        })

User对象:

from mongoengine import *
import datetime

class User(Document):
    name = StringField(max_length=200, required=True, unique=True)
    location = PointField(default=[0,0])

我的IndexControllerTest

class IndexControllerTest(unittest.TestCase):
    """
    This is the default controller Base class which
    sets up the server app and has handy asserts to make
    life easier when testing the controllers
    """

    def setUp(self):
        """
        Set up a global instance of the controller
        """
        self.app = server.app.test_client()

    def tearDown(self):
        conn = get_connection()
        conn.myapp.user.drop()
        #Have to do this because it does not clear the unique index

    def assertGet(self, path, data):
        """
        This will run a GET request and test the output
        """
        response = self.app.get(path)

        #print str(response.get_data())
        #print flask.json.dumps(response.data)

        parsed = flask.json.loads(response.data)
        self.assertEqual(parsed, data)

    def test_get_returns_one_user(self):
        """
        When I call a get I should get Users with thier data
        """

        user = User(name="muse")
        user.save()

        self.assertGet(
            "/",
            [ 
              { 
                "name": "muse", 
                "location": [ 0, 0 ]
              } 
            ],
            status_code=200
        )

输出gunicorn是我想要的!:

[
  {
    "name": "Hello",
    "location": [
      52.201962,
      0.128145
    ]
  },
  {
    "name": "World",
    "location": [
      0,
      0
    ]
  }
]

我的测试输出:

...
First differing element 0:
{u'name': u'muse', u'location': {u'type': u'Point', u'coordinates': [0, 0]}}
{'name': 'muse', 'location': [0, 0]}

- [{u'location': {u'coordinates': [0, 0], u'type': u'Point'}, u'name': u'muse'}]
+ [{'location': [0, 0], 'name': 'muse'}]

什么?为什么?在哪里?谁?@£ $@$% &£$(%&£$ (( & 疯狂!

我希望flask_restfullAPI 能够确保在这两种情况下输出是相同的

4

1 回答 1

0

事实证明,我的数据库从以前的插入中获得了以下内容:

{
        "_id" : ObjectId("56f6966f007502d9952babde"),
        "name" : "World",
        "created" : ISODate("2016-03-26T14:02:23.546Z"),
        "location" : [
                50.201962,
                1.128145
        ]
}

但我希望它是(测试是正确的):

{
        "_id" : ObjectId("56f6966f007502d9952babde"),
        "name" : "World",
        "created" : ISODate("2016-03-26T14:02:23.546Z"),
        "location" : {
                "type" : "Point",
                "coordinates" : [
                        50.201962,
                        1.128145
                ]
        }
}

所以我的测试是正确的,但是我的数据库反映不好,因此它不会按预期恢复。我假设如果数据错误,mongoengine 会抛出某种错误,但很高兴知道它没有。

于 2016-03-26T14:09:34.297 回答