2

我有一个方法可以返回满足特定条件的对象列表

result = find_objects(some_criteria)
print("%r" % result)

>> [<my_object.my_object object at 0x85abbcc>]

我想写一个pytest来验证find_objects()的操作

def test_finder(testbed):
    result = testbed.find_objects(some_criteria)

    assert result is [<my_object.my_object object at 0x85abbcc>]

到目前为止,pytest 指向左尖括号 (<) 并声明“SyntaxError”

我在想,即使我让它工作,将来当'my_object'存储在另一个位置时它也会失败。如果我有多个实例,我如何确认报告的实例数量正确?

在这种情况下,验证返回对象的方法的输出的pythonic方法是什么?

js

4

3 回答 3

4

如您所料,问题在于尝试进行“是”比较。'is' 表示“是完全相同的对象”,即使两个看起来相同的对象也可能无法通过此测试。

以下是您可能想要测试的一些内容

  • 没有引发异常
  • 返回的对象是正确的类型

    assert isinstance(object, ResultClass)

  • 返回的对象有一些特定的属性

    assert result.attribute == attribute

那种事。我不认为有一种“公认”的检查方式,只是您可能想要检查的几件事,由您决定要检查的内容。使用“is”是个坏主意,与内存中的位置进行比较是个坏主意。

于 2011-04-28T23:16:00.207 回答
2

你可以试试:

assert isinstance(result, my_object.my_object)

您还可以尝试比较字符串表示形式(这基本上就是您正在做的事情,除了缺少引号。)isinstance docs 可能还想查看repr 文档,以了解您的 print 语句中发生了什么。尖括号表示它不是对象的插件替代品。

于 2011-04-28T22:10:20.043 回答
2

线

assert result is [<my_object.my_object object at 0x85abbcc>]

实际上是 Python 中的语法错误 :)

如果要检查类型和长度,可以执行以下操作:

assert len(result) == 1
for x in result:
    assert isinstance(result, my_object.my_object)
于 2011-04-29T11:35:27.603 回答