首页 > 解决方案 > 引用单元测试中的相同实例(调用对象时不创建新实例)

问题描述

背景:我创建了一个类来从谷歌中提取信息。此类搜索搜索词并在搜索词有任何拼写错误时建议更正。

class gs:
    url_part1 = "https://www.googleapis.com/customsearch/v1?key="
    key = "some_key"
    cse = 'some_key'
    suggestion = 'None'

def __init__(self, search):
    self.search = search
    self.url = gs.url_part1 + gs.key + gs.cse + self.search
    #gs.suggestion = 'None'

def get_suggestion(self):
    r = requests.get(url=self.url)
    r_json = r.json()
    if 'spelling' in r_json.keys():
        gs.suggestion = r_json.get('spelling').get('correctedQuery')
    return gs.suggestion

例如,如果我搜索 paytn(正确的名称是 paytm),那么这个类建议更正 paytn 是 paytm

gs_1 = gs(search='paytn')
suggestion_1 = gs_1.get_suggestion()
print(suggestion_1) #suggestion for incorrect name
'paytm'

如果我搜索“paytm”而不是搜索 paytn,那么 gs 类没有任何建议。

gs_2 = gs(search='paytm')
suggestion_2 = gs_2.get_suggestion()
print(suggestion_2) #no suggestion for correct name
'None'

现在,在为 gs 类创建单元测试用例时,我观察到了一个非常奇怪的行为。self.gs_2正在从self.gs_1中获取值 并且未通过以下测试。

from search import gs
import unittest

class TestSearch(unittest.TestCase):

    def setUp(self):
        self.gs_1 = gs(search='paytn')
        self.gs_2 = gs(search='paytm')


    def test_get_suggestion(self):
        self.assertEqual(self.gs_1.get_suggestion(), 'paytm')
        self.assertEqual(self.gs_2.get_suggestion(), 'None')


    if __name__ == '__main__':
        unittest.main()

经过检查,很明显 self.gs_2 正在从 gs 类的第一个实例中获取值。请参考下面的输出

import search
suggestion 1 in setUp paytm
suggestion 2 in setUp paytm
F
======================================================================
FAIL: test_get_suggestion (test.TestSearch)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\YBL\test.py", line 15, in test_get_suggestion
    self.assertEqual(self.gs_2.get_suggestion(), 'None')
AssertionError: 'paytm' != 'None'
- paytm
+ None


----------------------------------------------------------------------
Ran 1 test in 3.028s

FAILED (failures=1)

谁能帮我理解

1)我的理解是否正确?

2) 为什么它从 gs_1 获取值而不是创建一个新实例?

标签: pythonunit-testingclassoop

解决方案


class gs:
    url_part1 = "https://www.googleapis.com/customsearch/v1?key="
    key = "some_key"
    cse = 'some_key'

    def __init__(self, search):
        self.search = search
        self.url = gs.url_part1 + gs.key + gs.cse + self.search
        self.suggestion = 'None'

    def get_suggestion(self):
        r = requests.get(url=self.url)
        r_json = r.json()
        if 'spelling' in r_json.keys():
            self.suggestion = r_json.get('spelling').get('correctedQuery')
        return self.suggestion

您使用suggestionin gs(整个类相同),而不是self.suggestion特定于实例的。您可以通过访问该值的方式查看它 -gs.suggestion表示它属于gsself.suggestion表示它属于传递给该方法的当前实例。;)

在您的情况下,第一遍覆盖了 thegs.suggestion而第二遍没有覆盖,因此它返回了以前的值。


推荐阅读