我正在学习用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实例作为第一个参数调用unbound方法assertEqual()(改为使用int实例)。所以我试过了:
TestCase.assertEqual(TestCase, api_object.status_code, 200, "Not getting a 200 back")
TypeError:必须使用TestCase实例作为第一个参数调用unbound方法assertEqual()(改为获取类型实例)。
此时我有点难过。我正在使用Django框架。在此先感谢您的帮助。
答案 0 :(得分:6)
这里最大的问题是为什么你首先使用静态方法。
请勿尝试使用TestCase
中的方法。你可以在这里使用assert
:
assert api_object.status_code == 200, "Not getting a 200 back"
在任何情况下,您都无法在没有实际TestCase.assertEqual()
实例的情况下调用TestCase
,因为该方法希望能够调用self
上的其他方法。
答案 1 :(得分:0)
Martijn是对的:来自TestCase
的{{1}}的实例方法需要从assertEqual()
的实例调用,因此您无法将它们移动到静态方法中期待他们的工作。请注意您的原始方法
TestCase
其中self.assertEqual(api_object.status_code, 200, "\nNot getting a 200\n")
可能是指self
个实例。这意味着在TestCase
的实施中某处有一个像这样的方法定义:
TestCase
请注意,在Python类方法中,始终包含对调用实例的引用作为第一个参数(def assertEqual(self, testValue, expectedValue, errorMsg):
)。这就是为什么当你尝试在没有self
实例的情况下调用方法时,你得到了错误" TypeError:unbound方法assertEqual()必须使用TestCase实例作为第一个参数调用(改为使用int实例)。 #34;
但是,我注意到你说你想要在一系列测试中重复使用静态方法,"这些测试大概是TestCase
个实例,就像你原来的非静态方法一样。如果是这种情况,您可以编写静态方法,如下所示:
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()
答案 2 :(得分:0)
熟悉类方法和静态方法之间的区别也很有用。
基本上,类方法对第一个参数采用实例,但静态方法不采用。