如何从模块调用函数内的函数

时间:2020-02-10 06:09:18

标签: python function unit-testing import module

尝试对代码进行单元测试时遇到问题。我有一个名为“ compute_stats2.py”的脚本,该脚本在函数“ main”中包含一个已定义的函数“ compute_stats”,因为我想稍后在该行中的main中构建一个命令行参数。在compute_stats中使用的函数都在main中定义,但是为了简洁起见,我将它们排除在外,如果需要查看,请告诉我。话虽如此,我一直在尝试进行单元测试(请参见下面的代码),并且每次尝试运行测试时都会发生此错误。

AttributeError:模块'compute_stats2'没有属性'compute_stats'

我想知道我是否在单元测试代码中未正确调用该函数。有关如何改善通话效果的任何建议。

P.S。如果确实可以解决问题,请事先道歉,我不是最强的编码器。


compute_stats2.py

def main():

  def compute_stats(values):
    if not values:
      return None
    else:
      o_min=minimum_of_list(values)
      o_max=values[-1]
      o_avg=average_of_list(values)
      o_median=median_of_list(values)
      return(o_min, o_max, o_avg, o_median)
if __name__ == '__main__':
  main()

test_compute_stats2.py

import unittest
import compute_stats2

class TestComputeStats2(unittest.TestCase):

def test_none_from_none(list):
    ret = compute_stats2.compute_stats(None)
    list.assertIsNone(ret)

def test_empty_list(list):
    ret = compute_stats2.compute_stats([])
    list.assertIsNone(ret)

def test_even_elements_list(list):
    ret = compute_stats2.compute_stats([1,2,3,4])
    list.assertEqual(ret, (1, 4, 2.5, 2.5))

def test_odd_elements_list(list):
    ret = compute_stats2.compute_stats([1,2,12])
    list.assertEqual(ret, (1, 12, 5, 2))

def test_single_element_list(list):
    ret = compute_stats2.compute_stats([43])
    list.assertEqual(ret, (43, 43, 43, 43))

2 个答案:

答案 0 :(得分:1)

compute_stats()main()内部的内部函数。由于您不在内部使用它,因此可以将其取出

def main(): # can be removed if there is no other use
  pass


def compute_stats(values):
  if not values:
    return None
  else:
    o_min=minimum_of_list(values)
    o_max=values[-1]
    o_avg=average_of_list(values)
    o_median=median_of_list(values)
    return(o_min, o_max, o_avg, o_median)

顺便说一句,如果测试在类内部,则它们需要self作为第一个参数。您还应该更改list作为参数名称,它是内置名称。

def test_none_from_none(self, test_list):

答案 1 :(得分:1)

您已经在main内构建了一个名为compute_stats的局部函数。 compute_stats的执行仅在由于作用域规则而调用main时才会发生。因此,如果要在当前状态下运行compute_stats,则需要导入并运行main。

如果要导入compute_stats,最好将main移到def compute_stats(val): pass def main(): pass 之外。您将不再构建在main下具有范围限制的局部函数。

例如

shareImage= (item) => {
  RNFetchBlob.fetch('GET', `some url`+item._id)
    .then(resp => {
      console.log('response : ', typeof resp);
      console.log('fff', resp.data);
      let base64image = resp.data;
      share('data:image/png;base64,' + base64image);
    })
    .catch(err => {
      err && console.log(err);
    });

  share = base64image => {
    console.log('base64image : ', base64image);
    var shareOptions = {
      title:item.title,
      url: base64image,
      // message: 'https://somelink.com some message',
      subject: 'Subject'
    };

    Share.open(shareOptions)
      .then(res => {
        console.log(res);
      })
      .catch(err => {
        err && console.log(err);
      });
    }
  }; 
相关问题