Что означает «использовать setattr [...] с целью, являющейся строкой импорта, разделенной точками»? - PullRequest
0 голосов
/ 14 июля 2020

Я начинаю изучать издевательство, я пытался построить пример ниже (Python 3.8), но получаю ошибку, которую не понимаю:

TypeError : use setattr(target, name, value) or setattr(target, value) with target being a dotted import string
import random
 
def division():
    nb = random.randrange(0, 2)
    return 100 / nb    # this is on purpose ;-)
 
def function_to_be_tested():
    result = division()
    return f"This is the result :{result}"
 
def test_function_to_be_tested_returns_str(monkeypatch):
    def mockreturn():
        return 50.0
    monkeypatch.setattr(division, mockreturn)    
    assert isinstance(function_to_be_tested(), str)

Как мне написать это?

1 Ответ

1 голос
/ 14 июля 2020

Вы можете получить доступ к текущему модулю, например, через sys.modules dict. Имя модуля задается в __name__, поэтому вы можете написать:

import sys

def test_function_to_be_tested_returns_str(monkeypatch):
    def mockreturn():
        return 50.0

    monkeypatch.setattr(sys.modules[__name__], 'division', mockreturn)
    assert function_to_be_tested() == "This is the result :50.0"

EDIT: это фактически ответ на следующий вопрос в комментариях - как получить доступ к текущему модулю. На фактический вопрос ответил @jonrsharpe путем ссылки на документацию .

...