Pytest 是类型的实例

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)

Zax*_*axR 1

我遇到了类似的问题,最终发现就我而言,它与相对导入路径问题有关。当我调查时MySubClass.__class__在 MyClass\ 模块的目录中运行 ipython 进行调查时,它与在测试文件夹上运行 pytest 时的情况不同。下面的例子:

\n\n

目录结构:

\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\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的模块.py:

\n\n
class MyClass:\n    def __init__(self, param1):\n        self.param1 = param1\n\nclass MySubClass(MyClass):\n    def __init__(self, param1):\n        super().__init__(param1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

test_my_module.py:

\n\n
def 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\'>\n
Run Code Online (Sandbox Code Playgroud)\n