如何在Python单元测试中从另一个对象创建对象



我很难理解Python中的单元测试。我有一个对象,retailer,它创建了另一个对象dealdeal指的是在retailer中创建的一个属性,所以我给它传递一个引用:

class deal():
def __init__(self, deal_container, parent):

deal_container属性也来自retailer,它调用自己的方法来创建它。那么,我如何创建所需的一切来轻松创建deal对象呢?

我是否必须在单元测试中创建retailer的实例,然后调用创建deal的对象中的方法?

我可以使用FactoryBoy创建retailer的实例吗?我如何在该对象中包含创建deal的方法?

最好的方法是什么?

这是单元测试。我正在设置soup_obj,我需要进行交易:

class TestExtractString(TestCase):
fixtures = ['deals_test_data.json']
def setUp(self):
with open('/home/danny/PycharmProjects/askarby/deals/tests/BestBuyTest.html', 'r') as myfile:
text = myfile.read().replace('n', '')
self.soup_obj = bs4.BeautifulSoup(text,"html.parser")
self.deal = self.soup_obj.find_all('div',attrs={'class':'list-item'})[0]
def test_extracts_title(self):
z = Retailer.objects.get(pk=1)
s = dealscan.retailer(z)
d = dealscan.deal(self.deal,s)
result = d.extract_string(self.deal,'title')

这是CCD_ 14中CCD_ 13类的相关比特。有一个retailer类可以创建deal,但我甚至还没有在retailer中写入创建deal的位。我希望我可以模拟deal所需的比特,而不必调用retailer,但我该如何处理deal引用retailer的事实?

class deal():
def __init__(self, deal_container, parent):
'''
Initializes deal object
Precondition: 0 > price
Precondition: 0 > old_price
Precondition: len(currency) = 3
:param deal_container: obj
'''
self.css = self.parent.css
self.deal_container = deal_container
self.parent = parent
self.title = self.extract_string('title')
self.currency = self.parent.currency
self.price = self.extract_price('price')
self.old_price = self.extract_price('old_price')
self.brand = self.extract_string('brand')
self.image = self.extract_image('image')
self.description = self.extract_string('description')
#define amazon category as clearance_url
#define all marketplace deals
def __str__(self):
return self.title
def extract_string(self, element, deal):
'''
:param object deal: deal object to extract title from
:param string element: element to look for in CSS
:return string result: result of string extract from CSS
'''
tag = self.css[element]['tag']
attr = self.css[element]['attr']
name = self.css[element]['name']
result = deal.find(tag, attrs={attr: name})
if result:
if element == 'title':
return result.text
elif element == 'price':
result = self.extract_price(result).text
if result:
return result
elif element == 'image':
result = self.extract_image(result)
return False

问题是deal对象在设置self.parent属性之前引用了父对象。用途:

self.parent = parent        
self.css = self.parent.css
self.deal_container = deal_container

并且CCD_ 23消失。

至于在单元测试中使用一个对象来创建另一个对象是否是一种好形式的问题,答案是你可以使用mock,但这样做也没问题。在setUp中使用helper方法设置父对象一次是可以接受的,这将使代码更容易阅读,并可能稍微提高测试性能。

最新更新