尝试对代码进行单元测试时遇到问题。我有一个名为“ compute_stats2.py”的脚本,该脚本在函数“ main”中包含一个已定义的函数“ compute_stats”,因为我想稍后在该行中的main中构建一个命令行参数。在compute_stats中使用的函数都在main中定义,但是为了简洁起见,我将它们排除在外,如果需要查看,请告诉我。话虽如此,我一直在尝试进行单元测试(请参见下面的代码),并且每次尝试运行测试时都会发生此错误。
AttributeError:模块'compute_stats2'没有属性'compute_stats'
我想知道我是否在单元测试代码中未正确调用该函数。有关如何改善通话效果的任何建议。
P.S。如果确实可以解决问题,请事先道歉,我不是最强的编码器。
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()
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))
答案 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);
});
}
};