我正在试图弄清楚如何编写一个试验测试用例,该测试用例会引发异常.
目前我有两种简单的方法来测试(成功和失败).每个方法都返回一个已经回调或错误返回的延迟.测试成功方法很好.在测试失败方法时,我希望能够断言引发了异常(使用assertRaises).
但是测试用例失败了,我得到了:
twisted.trial.unittest.FailTest: ConnectionRefusedError not raised (<Deferred at 0x920e28c current result: <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>> returned)
代码如下:
from twisted.trial.unittest import TestCase
from twisted.internet.defer import inlineCallbacks, succeed, fail
from twisted.internet.error import ConnectionRefusedError
class MyObject:
def success(self):
return succeed(True)
def failure(self):
return fail(ConnectionRefusedError())
class TestErrBack(TestCase):
def setUp(self):
self.o = MyObject()
@inlineCallbacks
def test_success(self):
result = yield self.o.success()
self.assertTrue(result)
@inlineCallbacks
def test_failure(self):
# this test case is failing !
yield self.assertRaises(ConnectionRefusedError, self.o.failure)
我在test_failure中使用正确的方法吗?我可以使用try ...来调用self.o.failure,但我不认为这种方法与使用assertRaises一样好.
假设我使用该方法定义了以下类foo:
class MyClass:
def foo(self):
print "My name is %s" % __name__
Run Code Online (Sandbox Code Playgroud)
现在,当我打电话时,foo()我希望/希望看到这个打印出来
My name is foo
Run Code Online (Sandbox Code Playgroud)
但是我得到了
My name is __main__
Run Code Online (Sandbox Code Playgroud)
如果我将类定义放入一个名为FooBarI get 的模块中
My name is FooBar
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做
m = MyClass()
print m.foo.__name__
Run Code Online (Sandbox Code Playgroud)
我得到了我想要的东西
My name is foo
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙解释为什么__name__引用模块而不是方法名称?有一个简单的方法来获取方法名称?
非常感谢
以下是我重现问题的方法:
创建一个名为"temp.log"的日志文件并将此行粘贴到其中
DEBUG: packetReceived '\x61\x62\x63'
我想有一个脚本,它将从日志文件中读取行并解码二进制字符串部分('\ x61\x62\x63').对于解码,我使用struct,所以:
struct.unpack('BBB', '\x61\x62\x63')
应该给我
(97, 98, 99)
这是我正在使用的脚本
import re
import struct
import sys
f = open(sys.argv[1], 'r')
for line in f:
print line
packet = re.compile(r"packetReceived \'(.*)\'").search(line).group(1)
# packet is the string r'\x61\x62\x63'
assert(len(packet), 12)
# this works ok (returns (97, 98, 99))
struct.unpack('BBB', '\x61\x62\x63')
# this fails because packet is interpreted as r'\\x61\\x62\x63'
struct.unpack('BBB', packet)
我使用temp.log作为脚本的参数来运行脚本.
希望这些评论突出我的问题.如何将变量包解释为'\ x61\x62\x63'?
ASIDE:在第一次编辑这个问题时,我假设读取文件中的行与此相同:line ="DEBUG:packetReceived'\ x61\x62\x63'",这使得数据包=='abc'
但它实际上与此相同(使用rawstring)line = r"DEBUG:packetReceived'\ x61\x62\x63'"