【问题标题】:Why doesn't unittest recognize SQLAlchemy data type?为什么 unittest 不能识别 SQLAlchemy 数据类型?
【发布时间】:2020-05-25 06:01:57
【问题描述】:

我编写了一个函数,它返回一个 SQLAlchemy 数据类型以及该类型的参数。但是,当我尝试测试该函数时,unittest 告诉我函数返回的类型与我期望的类型不匹配。但是,它似乎向我展示了函数的返回值和我的预期结果确实匹配。

简化代码示例...

from sqlalchemy import Numeric

class TestStandardizeColDataTypes(unittest.TestCase):
    def test_successful_numeric(self):
        self.assertEqual(standardize_col_data_type('Dec'), Numeric(precision=12, scale=2))

这是单元测试结果显示的内容(通过 Pycharm)...

Numeric(precision=12, scale=2) != Numeric(precision=12, scale=2)

Expected :Numeric(precision=12, scale=2)
Actual   :Numeric(precision=12, scale=2)

看起来它们确实是相等的。我尝试将测试类型更改为 AssertIs 和 AssertIsInstance,但没有任何运气。

关于我在这里缺少什么的任何想法?谢谢!

【问题讨论】:

  • 你能添加你对standardize_col_data_type()的实现吗
  • 这与unittest无关
  • @aws_apprentice 但是 unittest 不是没有像我预期的那样响应吗?
  • Numeric 类可能没有定义__eq__ 所以unittest 无法知道这两个对象是否实际上相同。你最好手动比较精度和比例。
  • @Ben 似乎已经有了包含必要信息的答案。将其标记为已接受:)

标签: python sqlalchemy python-3.7 python-unittest


【解决方案1】:

问题是您试图比较两个没有实现__eq__ 方法的对象之间的相等性。您可以在文档中看到,如 show here

出现这种行为的原因如下:

用户自定义类默认有eq()和hash()方法;与它们相比,所有对象都比较不相等(除了它们自己)并且 x.hash() 返回一个适当的值,使得 x == y 意味着 x 是 y 和 hash(x) == hash( y)。

你可以找到更详细的描述here

一种选择是创建一个继承自Numeric 类型并定义__eq__ 方法的自定义类。 另一个选择是@rdas 在他的评论中提到的:

最好手动比较精度和比例。

【讨论】:

    【解决方案2】:

    @aws_apprentice 所说的是正确的。然而,一个简单的解决方法是比较 vars 函数返回的两个对象的属性字典:

    self.assertEqual(vars(standardize_col_data_type('Dec')), vars(Numeric(precision=12, scale=2)))
    

    这避免了必须单独硬编码每个属性的名称以进行比较。

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多