在python的静态方法中使用AssertEquals

在python的静态方法中使用AssertEquals,python,django,unit-testing,assert,Python,Django,Unit Testing,Assert,我正在学习用Python编写代码,遇到了一些麻烦。我试图创建一个静态方法,以便在一系列测试中重用,而我似乎无法让单元测试在该方法中工作。在使用静态方法之前,测试功能如下: self.assertEqual(api_object.status_code, 200, "\nNot getting a 200\n") 在静态方法中,我尝试了几种可能的解决方案,但收效甚微。我已确认传入的值是明确匹配的。变化和故障(以及我的调试过程)的快速总结。抱歉,我无法提供更多代码和工作敏感信息: assertEq

我正在学习用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:必须使用TestCase实例作为第一个参数调用未绑定的方法assertEqual()(改为使用int实例)。所以我试着:

TestCase.assertEqual(TestCase, api_object.status_code, 200, "Not getting a 200 back")
TypeError:必须使用TestCase实例作为第一个参数调用未绑定的方法assertEqual()(改为获取类型实例)

在这一点上,我有点不知所措。我正在使用Django框架。提前感谢您的帮助。

这里的一个大问题是为什么您首先要使用静态方法

不要试图在这里使用
TestCase
中的方法。您可以在此处使用
assert

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

在任何情况下,如果没有实际的
TestCase
实例,就不能调用
TestCase.assertEqual()
,因为该方法希望能够在
self
上调用其他方法。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):
def runCommonTests(testInstance, other_args):
    api_object = get_api_object_somehow()
    ...
    testInstance.assertEqual(api_object.status_code, 200, "Not getting a 200 back")
请注意,在Python类方法中,对调用实例的引用始终作为第一个参数(
self
)包含。这就是为什么当您尝试在没有
TestCase
实例的情况下调用该方法时,会出现错误“TypeError:unbound method assertEqual()必须使用TestCase实例作为第一个参数调用(改为使用int实例)。”

然而,我注意到,您说希望“在一系列测试中重用静态方法”,这些测试可能是
TestCase
实例,就像您最初的非静态方法一样。如果是这样,您可以这样编写静态方法:

def assertEqual(self, testValue, expectedValue, errorMsg):
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)

另外,熟悉类方法和静态方法之间的区别也很有好处


基本上,类方法以实例作为第一个参数,而静态方法则不然。

很难判断这里发生了什么
assertEqual
是TestCase的一种方法——应该在当前测试内容的测试用例上调用它。我想有一个问题是,为什么一开始就把这个调用移到“staticmethod”中去了?谢谢Martijn,现在有道理了。至于我为什么要使用static,我们正在考虑构建一个库,这将是用于设置测试的方法之一。因为没有必要在这个断言之外操作对象,而且一个不会改变的快速过程对我来说将其设置为静态是有意义的。如果现在有人发现自己在这里,我不同意使用断言的建议。测试用例方法提供了与其他测试的一致性,以及其他开发人员友好性。相反,我建议只实例化一个测试用例并像这样调用方法:
TestCase().assertEqual(a,b)
@theannouncer当然,但问题是如何在静态方法中做到这一点:-)我也在我的答案前面加了一个大问题,这就是为什么首先要使用静态方法。原因之一。@theannouncer最后但并非最不重要的一点:所有TestCase断言方法在失败时都会引发AssertionError,就像
assert
一样,这里没有不一致之处。我的建议是在静态方法中实例化TestCase。assertEquals的输出在调试时更加清晰,assert依赖于作者编写一条好消息。