Mocking urllib2.urlopen().read() for different responses

前端 未结 1 1979
北海茫月
北海茫月 2020-12-17 19:28

I am trying to mock the urllib2.urlopen library in a way that I should get different responses for different urls I pass into the function.

The way I am doing it in

相关标签:
1条回答
  • 2020-12-17 20:02

    The argument to patch needs to be a description of the location of the object, not the object itself. So your problem looks like it may just be that you need to stringify your argument to patch.

    Just for completeness, though, here's a fully working example. First, our module under test:

    # mod_a.py
    import urllib2
    
    def myfunc():
        opened_url = urllib2.urlopen()
        return opened_url.read()
    

    Now, set up our test:

    # test.py
    from mock import patch, Mock
    import mod_a
    
    @patch('mod_a.urllib2.urlopen')
    def mytest(mock_urlopen):
        a = Mock()
        a.read.side_effect = ['resp1', 'resp2']
        mock_urlopen.return_value = a
        res = mod_a.myfunc()
        print res
        assert res == 'resp1'
    
        res = mod_a.myfunc()
        print res
        assert res == 'resp2'
    
    mytest()
    

    Running the test from the shell:

    $ python test.py
    resp1
    resp2
    

    Edit: Whoops, initially included the original mistake. (Was testing to verify how it was broken.) Code should be fixed now.

    0 讨论(0)
提交回复
热议问题