模拟方法属性python抛出AttributionError

时间:2017-08-22 12:24:25

标签: python unit-testing mocking

我有以下方法:

def get_countries(cities):
     prefix = os.getenv("PREFIX")
     ...
     ...

我想模拟这个前缀属性(因为我没有找到一种方法来模拟os.getenv("PREFIX")@mock.patch.dict(os.environ, {"PREFIX": "P"})中的一个键 - 会模拟整个dict并且可能有其他键我想保留。

所以我写了以下内容:

@mock.patch.object("get_countries", "prefix", "P")
    def test_get_aggregated_performance_records_countries_min_spend():
     ...

我收到错误:

AttributeError: get_countries does not have the attribute 'prefix'

我做错了什么?

1 个答案:

答案 0 :(得分:1)

prefix不是get_countries函数的属性。它是一个函数范围的变量,它包含在get_countries中,但它不是get_countries的属性:)

如果修补os.environ是不可接受的,您可以重构以prefix作为参数:

def get_countries(cities, prefix=os.getenv("PREFIX")):
     ...
     ...

使得为单元测试提供值非常简单。

此外,如果您patch编辑os.environ,则只会影响当前的测试用例。您需要为单个测试指定多少个键?