【问题标题】:Flask unittest api url with variable带有变量的烧瓶 unittest api url
【发布时间】:2021-03-06 18:51:20
【问题描述】:

我正在测试一个 API,并且是:

@app.route("/my-api/<token>", methods=["GET", "POST"])
def get_url(token):
    s = TimedJSONWebSignatureSerializer("KEY")
    try:
        url = s.loads(token)
    except:
        abort(400, "URL not identified")

    head, tail = ntpath.split(url)
    head = head + "/"
    filename = ntpath.basename(url)

    return send_from_directory(directory=head, filename=filename), 201

和这样的单元测试:

class BasicTests(unittest.TestCase):
    def setUp(self):
        self.test_token1 = "eyJhbGciOiJIUzUxMiIsImlhdCI6MTYxNTA1NTA4NSwiZXhwIjoxNjE1MDc1MDg1fQ.InRlc3Qi.Nm37UI69YrvPdcKyr0iAOKY_m1AmqknydosWaJcuULxfxJcrVxTsXQor60nZjH0EBb3zWemD8LMKM1rzIdxf9B"
        self.test_token2 = "abc123"

    def test_get_url_201(self):
        with app.test_client() as client:
            response = client.get(
                f"/my-api/{self.test_token1}"
            )

        print(f"RESPONSE: {response}")

        assert response.status_code == 201

    def test_get_url_400(self):
        with app.test_client() as client:
            response = client.get(
                f"/my-api/{self.test_token2}"
            )

        assert response.status_code == 400

def test_201(self):
    with unittest.mock.patch("flask.send_from_directory") as mocked:
        mocked.return_value = "Test Mock"
        response = app.test_client().get(f"/my-api/{self.test_token1}")
        print(response)

    self.assertTrue(mocked.called)
    assert response.status_code == 201

我试图让 api 返回 201 的 status_code,但我得到了 404。我哪里出错了?

编辑:前两个测试是集成测试。添加了单元测试test_201。两个断言都失败:

【问题讨论】:

    标签: python api flask python-unittest


    【解决方案1】:

    您所做的不是单元测试,而是 api/集成测试。这意味着您有意避免模拟依赖项,例如 ntpath 和 send_from_directory。

    也就是说,你得到 404(而不是 400)的事实意味着加载函数没有抛出异常,这给我们留下了 2 个潜在的故障点:要么头/文件名出错,要么 send_from_directory 由于某些任意原因而失败。

    首先打印头和文件名,看看它们是否有问题。如果两者都有效,您将不得不探索导致 send_from_directory 失败的原因。

    【讨论】:

    • 谢谢,我更新了原始帖子以反映您的 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多