2017-08-22 34 views
1

我有以下方法:模拟方法属性蟒蛇抛出AttributionError

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

我想嘲笑这个前缀属性(因为我没有找到一个方法来嘲笑在os.getenv("PREFIX")@mock.patch.dict(os.environ, {"PREFIX": "P"})只需一个键 - 会嘲笑整个字典,而且有可能是我想保留其他键

所以我写了以下内容:

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

我得到一个n错误:

AttributeError: get_countries does not have the attribute 'prefix' 

我在做什么错?

回答

1

prefix不是get_countries函数的属性。这是一个函数范围的变量,也就是封闭在get_countries,但它不是get_countries :)

一个属性如果修补os.environ是不可接受的,你可以重构暴露prefix作为参数:

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

制作为单元测试提供一个值是微不足道的。


此外,如果你patchos.environ,它应该只影响当前的测试案例。您需要为单个测试指定多少个密钥?

+1

我更喜欢使用模拟,而不是修改我的测试代码。有没有办法模拟函数作用域变量? 关于os env的问题 - 这意味着我们需要维护这个补丁,如果我们计划在未来使用更多的sys env,在其他情况下,它们的值不会影响测试。 – Dejell