Mongoengine + MongoMock не возвращает данные, как ожидалось

Я пытаюсь проверить ответ, сделанный контроллером. Отклик другой, когда я запускаю его через 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_restfull API для обеспечения того, чтобы в обоих случаях вывод был одинаковым

1 ответ

Оказывается, у моей БД было следующее из предыдущей вставки:

{
        "_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 выдаст какую-то ошибку, но приятно знать, что это не так.

Другие вопросы по тегам