2016-11-22 34 views
1

我有一些模型MagicMock不叫Django的信號

class Foo(models.Model): 
    name = models.CharField(...) 
    url = models.URLField(...) 

foo_pre_save_(sender, instance, *args, **kwargs): 
    r = urlopen(instance.url)  # Magic mock is not called 
    html = bs4.BeautifulSoup(r.read(), "html5lib") 
    instance.name = html.find(name="title").text 

與測試

def test_get_site_name(self): 
    with mock.patch('urllib.request.urlopen') as get_mock: 
     get_mock.return_value = mock_response = mock.MagicMock() 
     mock_response.read.return_value = "<title>facebook</title> 

     foo = Foo.objects.create(
       url = 'www.facebook.com' 
      ) 

    self.assertEqual(foo.name, "facebook") 

但pre_save信號實際上是走出去,擊中所提供的URL,並沒有得到模擬響應內

我認爲這與patch的範圍有關;但是,我不知道如何解決它。

回答

0

你的問題很可能是這一行:

with mock.patch('urllib.request.urlopen') as get_mock: 

你打補丁,其中定義函數的名稱,而不是它是進口的。試試這個:

# `myapp.models` is the module containing `Foo` 
with mock.patch('myapp.models.urlopen') as get_mock: 

欲瞭解更多信息,請參閱文檔中的where to patch部分。