Giter VIP home page Giter VIP logo

Comments (9)

yohanboniface avatar yohanboniface commented on May 2, 2024

I may work on this, if it's still on track.
Two questions:

Basically, I think such move should take two steps:

  • switch to pytest as test runner; but keeping tests as they are
  • moving to function based tests and assert based assertions little by little

Thoughts?

from falcon.

butla avatar butla commented on May 2, 2024

I totally think that testing without test classes (so essentially easy support for pytest) should be supported. @yohanboniface pytest-falcon looks cool, but I went with something really minimalistic and unopinionated with my project (with the thought of merging it into Falcon):

from falcon.testing import StartResponseMock, create_environ

def simulate_falcon_request(api, path='/', encoding=None, **kwargs):
    """Simulates a request to a `falcon.API`.

    Args:
        api (falcon.API): API object to send the request to.
        path (str, optional): The path to request.
        encoding (str, optional): If this is set to a character encoding,
            such as 'utf-8', `simulate_falcon_request` will assume the
            response is a single byte string, and will decode it as the
            result of the request, rather than simply returning the
            standard WSGI iterable.
        kwargs (optional): Same as those defined for
            `falcon.testing.create_environ`.
    """
    resp_headers = StartResponseMock()
    result = api(
        create_environ(path=path, **kwargs),
        resp_headers)

    final_result = result

    if encoding is not None:
        if result:
            final_result = result[0].decode(encoding)
        else:
            final_result = ''

    return final_result, resp_headers

With the function above you can create helpers or partial functions that have some common defaults (encoding='utf-8', some Authorization header, etc.) and decrease the amount of code in tests. Those helpers could also go upstream.

I would also want to create a documentation page about testing including a few useful examples, because the current docs on readthedocs left me scratching my head for a while and going through the code when I was starting with Falcon. It would showcase both the old style of testing and the one I'd introduce.

But I need to know if there'll be interest in merging my changes. @kgriffs What do you say?

from falcon.

kgriffs avatar kgriffs commented on May 2, 2024

Circling back on this. Something along the lines of what @butla proposed would be cool, albeit using the new requests-like testing framework. Should be pretty straightforward to make some free functions and then have class methods that wrap them for backwards compat.

P.S. - I created a separate issue (#844) for migrating Falcon's own tests.

from falcon.

kgriffs avatar kgriffs commented on May 2, 2024

BTW, we should make sure we give an example in the docs of how to use a fixture to setup an api instance.

from falcon.

butla avatar butla commented on May 2, 2024

That was exactly what I had in mind :) Oh, and a side note: Hug also has an implementation of function-based Falcon testing.

from falcon.

kgriffs avatar kgriffs commented on May 2, 2024

OK, cool. I'd like to just have some basic py.test support in the framework out of the box, but others are free to create alternative, possibly more advanced solutions.

@butla did you have some bandwidth to implement this over the next couple of weeks? If not, I'd be happy to take it on. Just let me know. Thanks!

from falcon.

butla avatar butla commented on May 2, 2024

@kgriffs I'll probably not have the time in this and the next month, so good luck to you :)

from falcon.

kgriffs avatar kgriffs commented on May 2, 2024

Sounds good, I'll tackle it then. 👍

from falcon.

kgriffs avatar kgriffs commented on May 2, 2024

Added new free functions and a pytest-friendly helper class for simulating requests, and an example in the module docstring showing how to employ them via pytest.

from falcon.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.