关于上传xls文件的单元测试

时间:2009-08-12 08:37:46

标签: django

这是我的测试代码:

def test_import_data(self):
       f = open('commend/fixtures/Book2.xls')
       postdata = {'datatype':'intonetwork','datafile':f}
       response = self.client.post('/commend/saledata/import_data/',postdata)
       self.failUnlessEqual(response.status_code, 200)

但在视图代码中:

file = request.FILES['datafile']
size = file.size

大小只等于6。

所以我调试了Client.post代码:

def encode_file(boundary, key, file):
   to_str = lambda s: smart_str(s, settings.DEFAULT_CHARSET)
   return [
       '--' + boundary,
       'Content-Disposition: form-data; name="%s"; filename="%s"' \
           % (to_str(key), to_str(os.path.basename(file.name))),
       'Content-Type: application/octet-stream',
       '',
       file.read()
   ]

当我打开commend / fixtures / Book2.xls时。

>>> f = open("commend/fixtures/Book2.xls")
>>> f.read()

'\ XD0 \ XCF \ X11 \ xe0 \ XA1 \ XB1'

>>> f.read()

'\ X00 \ xb9 \ XA4 \ XD7 \ XF7 \ XB1 \固定的\ X00 \ X03 \ X00 \ X00 \ X00 \ X03 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X0 0 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X0 0 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X0 0 \ x00 \ x00 \ x00 \ x00 \ x01 \ x00 \ xfe \ xff \ x03 \ n \ x00 \ x00 \ xff \ xff \ xff \ xff \ x08 \ x02 \ x00 \ x00 \ x00 \ x00 \ x00 \ xc0 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00F#\ x00 \ x00 \ x00Microsoft Office Excel 200 3 \ xb9 \ xa4 \ xd7 \ xf7 \ xb1 \ xed \ x00 \ x06 \ x00 \ x00 \ x00Biff8 \ x00 \ x0e \ x00 \ x00 \ x00Excel.She et.8 \ X00 \ xf49 \ xb2q \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X ........................

第一次输入f.read()时,输出'\ xd0 \ xcf \ x11 \ xe0 \ xa1 \ xb1',而不是整个xls文档内容。

我该怎么办?

2 个答案:

答案 0 :(得分:2)

尝试以二进制模式打开文件:

f = open('commend/fixtures/Book2.xls', 'rb')

答案 1 :(得分:0)

我认为这是用Unicode读取的。只是为了测试,尝试以其他格式保存xls文件,看看会发生什么。 Here暴露了Python中Unicode的问题。