代码之家  ›  专栏  ›  技术社区  ›  user1050619

python响应-并非所有请求都已执行

  •  1
  • user1050619  · 技术社区  · 6 年前

    我正在尝试测试用例模拟API调用,并使用Python响应模拟API调用。

    下面是我的模型,

    with responses.RequestsMock() as rsps:
        url_re = re.compile(r'.*udemy.com/api-2.0/courses.*')           
        url_re = re.compile(r'https://www.udemy.com/api-2.0/courses')
        rsps.add(
            responses.GET, url_re,
            body=mocked_good_json, 
            status=200,
            content_type='application/json',
            match_querystring=True
        )
        courses = self.app.courses.get_all(page=1, page_size=2)         
        for course in courses:              
            self.assertTrue(isinstance(course, Course))
            self.assertTrue(hasattr(course, 'id'))
            self.assertTrue(hasattr(course, 'title'))           
            self.assertIsNotNone(course.id)        
    

    当我执行这个模拟时,我得到这个错误-

    AssertionError: Not all requests have been executed [(u'GET', 'https://www.udemy.com/api-2.0/courses/')]
    

    当我移除mock并直接调用api时,它可以正常工作。

    有没有输入我的模拟失败的原因?

    错误信息

    ======================================================================
    FAIL: test_get_all_courses (tests.test_courses.TestApiCourses)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/rem/git/udemy/tests/test_courses.py", line 136, in test_get_all_courses
        courses = self.app.courses.get_all(page=1, page_size=2)
      File "/Users/rem/.virtualenvs/udemyapp/lib/python2.7/site-packages/responses.py", line 536, in __exit__
        self.stop(allow_assert=success)
      File "/Users/rem/.virtualenvs/udemyapp/lib/python2.7/site-packages/responses.py", line 620, in stop
        [(match.method, match.url) for match in not_called]
    AssertionError: Not all requests have been executed [(u'GET', 'https://www.udemy.com/api-2.0/courses/')]
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Mauro Baraldi    6 年前

    您正在模拟请求,但此测试未调用该请求。你在呼唤 courses = self.app.courses.get_all (page = 1, page_size = 2) 我怀疑这个方法 courses.get_all 正在调用请求库。

    根据 docs 在为mock添加响应之后,应该调用请求。你不会在刚打过电话之后再打电话 get_all ,此方法正在调用,请求。

    所以,你必须移动这个测试,并调整它, 全力以赴 方法,或者模拟来自使用它的类的请求,我想看看您的代码 Course.get_all .