【问题标题】:Using AssertEquals in a static method in python在 python 的静态方法中使用 AssertEquals
【发布时间】:2014-12-16 21:50:40
【问题描述】:

我正在学习用 Python 编写代码,但遇到了一些困难。我正在尝试创建一个静态方法以在一系列测试中重用,但我似乎无法让单元测试在该方法中工作。在转向静态方法之前,测试功能如下:

self.assertEqual(api_object.status_code, 200, "\nNot getting a 200\n")

在静态方法中,我尝试了几种可能的解决方案,但收效甚微。我已经确认传入的值是绝对匹配的。变化和故障(以及我的调试过程)的快速总结。对不起,我不能提供更多代码,工作敏感的东西:

assertEqual(api_object.status_code, 200, "\nNot getting a 200\n")

错误:全局名称 assertEqual 未定义。为了纠正我试过:

TestCase.assertEqual(api_object.status_code, 200, "Not getting a 200 back")

TypeError:未绑定的方法 assertEqual() 必须以 TestCase 实例作为第一个参数调用(取而代之的是 int 实例)。所以我尝试了:

TestCase.assertEqual(TestCase, api_object.status_code, 200, "Not getting a 200 back")

TypeError:未绑定的方法 assertEqual() 必须以 TestCase 实例作为第一个参数调用(取而代之的是类型实例)。

在这一点上,我有点难过。我正在使用 Django 框架。提前感谢您的帮助。

【问题讨论】:

  • 很难说这里发生了什么。 assertEqual 是 TestCase 的一种方法——它应该在当前正在测试的测试用例上调用。我想一个问题是你为什么首先要把这个调用变成一个“静态方法”?

标签: python django unit-testing assert


【解决方案1】:

这里最大的问题是你为什么首先使用静态方法

这里不要尝试使用TestCase 中的方法。你可以在这里使用assert

assert api_object.status_code == 200, "Not getting a 200 back"

在任何情况下都不能在没有实际的 TestCase 实例的情况下调用 TestCase.assertEqual(),因为该方法希望能够在 self 上调用其他方法。

【讨论】:

  • 谢谢 Martijn -- 现在说得通了。至于我为什么使用静态,我们正在考虑构建一个库,这将是用于设置测试的方法之一。因为除了这个断言和一个不会改变的快速过程不需要操作对象之外,我将它设置为静态是有意义的。
  • 如果有人现在发现自己在这里,我不同意使用断言的建议。测试用例方法提供与其他测试的一致性以及其他开发人员友好性。相反,我建议只实例化一个测试用例并像这样调用方法:TestCase().assertEqual(a,b)
  • @theannouncer 当然,但问题是如何在静态方法中做到这一点:-) 我也确实在我的答案前加上 这里的大问题是为什么你在第一名。是有原因的。
  • @theannouncer 最后但同样重要的是:所有 TestCase 断言方法都会在失败时引发 AssertionError,就像 assert 所做的那样,这里没有不一致。
  • 我的建议是在您的静态方法中实例化 TestCase。调试时assertEquals输出更清晰,assert取决于作者写的好消息。
【解决方案2】:

Martijn 是对的:来自TestCase 的实例方法如assertEqual() 需要从TestCase 的实例中调用,因此您不能只是将它们移动到静态方法并期望它们能够工作。注意你原来的方法是怎样的

self.assertEqual(api_object.status_code, 200, "\nNot getting a 200\n")

其中self 可能指的是TestCase 实例。这意味着在TestCase 的实现中的某个地方有这样一个方法定义:

def assertEqual(self, testValue, expectedValue, errorMsg):

请注意,在 Python 类方法中,对调用实例的引用始终包含在第一个参数中 (self)。这就是为什么当您尝试在没有 TestCase 实例的情况下调用该方法时,会收到错误“TypeError: unbound method assertEqual() must be called with TestCase instance as first argument (got in int instance)。”

但是,我注意到您说您想“在一系列测试中重用您的静态方法”,并且这些测试大概是 TestCase 实例,就像您原来的非静态方法一样。如果是这种情况,您可以像这样编写静态方法:

def runCommonTests(testInstance, other_args):
    api_object = get_api_object_somehow()
    ...
    testInstance.assertEqual(api_object.status_code, 200, "Not getting a 200 back")

然后在您的非静态 TestCase 方法中,您将调用静态方法并将当前的 TestCase 实例传递给它以使用。所以你原来有self.assertEqual() 行的地方,你会写

runCommonTests(self, other_args)

【讨论】:

    【解决方案3】:

    熟悉类方法和静态方法的区别也有好处。

    基本上类方法的第一个参数是实例,但静态方法不是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2022-12-22
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多