nol*_*man 6 python pytest isinstance python-3.x
我对 Python 很陌生,我正在设置一个小游戏,我想测试它。目前,我正在生成一个对象数组(石头、布、剪刀),每个对象都继承自 Roll 对象:
def build_the_three_rolls():
return [Rock(), Paper(), Scissors()]
Run Code Online (Sandbox Code Playgroud)
这是我使用 py.test 进行的测试:
def test_building_rolls():
assert len(build_the_three_rolls()) == 3
assert isinstance(build_the_three_rolls()[0], Rock)
assert isinstance(build_the_three_rolls()[1], Paper)
assert isinstance(build_the_three_rolls()[2], Scissors)
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我收到以下错误:
> assert isinstance(build_the_three_rolls()[1], Paper)
E assert False
E + where False = isinstance(<roll.Paper object at 0x110ab42e8>, Paper)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会失败
谢谢!
更新:
这是 Roll 及其子类的定义:
class Roll:
def __init__(self, name, defeated_by_self, defeat_self):
self.name = name
self.defeated_by_self = defeated_by_self
self.defeat_self = defeat_self
class Rock(Roll):
def __init__(self):
defeated_by_self = {}
defeated_by_self["Scissors"] = "Scissors"
defeat_self = {}
defeat_self["Paper"] = "Paper"
super().__init__("Rock", defeated_by_self, defeat_self)
class Paper(Roll):
def __init__(self):
defeated_by_self = {}
defeated_by_self["Rock"] = "Rock"
defeat_self = {}
defeat_self["Scissors"] = "Scissors"
super().__init__("Paper", defeated_by_self, defeat_self)
class Scissors(Roll):
def __init__(self):
defeated_by_self = {}
defeated_by_self["Paper"] = "Paper"
defeat_self = {}
defeat_self["Rock"] = "Rock"
super().__init__("Scissors", defeated_by_self, defeat_self)
Run Code Online (Sandbox Code Playgroud)
我遇到了类似的问题,最终发现就我而言,它与相对导入路径问题有关。当我调查时MySubClass.__class__在 MyClass\ 模块的目录中运行 ipython 进行调查时,它与在测试文件夹上运行 pytest 时的情况不同。下面的例子:
目录结构:
\n\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 project\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_module.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_my_module.py\nRun Code Online (Sandbox Code Playgroud)\n\n我的模块.py:
\n\nclass MyClass:\n def __init__(self, param1):\n self.param1 = param1\n\nclass MySubClass(MyClass):\n def __init__(self, param1):\n super().__init__(param1)\nRun Code Online (Sandbox Code Playgroud)\n\ntest_my_module.py:
\n\ndef test_my_sub_class():\n pkl_instance = # loaded from a pkl file saved from ipython\n test_instance = MySubClass(param1="This was instantiated in \n test_my_module.py")\n\n # assert isinstance(pkl_instance, test_instance) fails\n print(pkl_instance.__class__) # <class \'my_module.MySubClass\'>\n print(test_instance.__class__) # <class \'project.src.my_module.MySubClass\'>\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
11145 次 |
| 最近记录: |