2014-09-25 69 views
1

我正在尝试在Python中编写一个测试,检查我正在编写的类中的某个方法是否为某个Hdf文件中的数据集设置了属性值。逻辑如下:类的实例通过传递h5py.File的实例来构造,然后一个方法在该文件内创建数据集。在下一步中,我有另一种方法来为这个数据集设置特定的属性。测试是否有一些字段已在python中初始化

什么我想测试,如果我的类方法create_attributes(个体经营,属性)领域hdf_file [dset_name] .attrs [attr_name]设置对在属性变量通过一定的价值。但是,我想避免实际创建一个Hdf文件。到目前为止,我试图嘲笑一个hdf文件的实例并使用它。最低工作代码示例是以下几点:

import h5py 

class TestSomething: 
    @mock.patch('h5py.File') 
    def test_if_attr_is_initialized(self,mock_hdf): 
     # Here I would like to call a function that basically executes 
     # the following line: 
     mock_hdf['test_dset'].attrs['test_field']='value' 

     # Then I want to check if the attribute field has been assigned 
     assert mock_hdf['test_dset'].attrs['test_field']=='value' 

任何人可以帮助我找到了正确的事情,以检查是否在HDF文件属性的设置是否正确?任何帮助将不胜感激,我是所有嘲笑技术的完全新手。

编辑:

在下面我提供了两个类,以及相应的测试最小的代码示例作为requeseted由二战:

import h5py 

class HdfWriter(): 
    def __init__(self,hdf_file): 
     self.hdf_file=hdf_file 

    def create_attrs(self,attributes): 
     dset_name=attributes.keys()[0] 
     attrs=attributes[dset_name] 

     for key in attrs: 
      self.hdf_file[dset_name].attrs[key]=attrs[key] 

请注意这里是一个真正的HDF文件我首先必须创建一个数据集,但是我想将其留给另一个测试。下面的测试应该只是检查一下,是否为一个虚构的HDF文件,其中有数据集test_dset此数据集的属性写入:

import h5py 
import HdfWriter 

class TestSomething: 
    @mock.patch('h5py.File') 
    def test_if_attr_is_initialized(self,mock_hdf): 
     writer=hw.HdfWriter(mock_hdf) 
     attr={'test_dset':{'test_field':'test_value'}} 
     writer.create_attrs(attr) 

     assert writer.hdf_file['test_dset'].attrs['test_field']=='value' 
+0

您可能没有发布足够的信息。似乎你想嘲笑/修补未绑定的类方法和/或属性。你可以发布一个最小的例子吗? – wwii 2014-09-25 12:10:16

+0

感谢您的快速响应...我现在已经为班级和相应的测试发布了一个最小示例。我发布的类不起作用,它需要另一种创建数据集的方法。为了测试,我想避免涉及创建数据集的功能。 – Chris 2014-09-25 12:27:14

+0

你问如何模拟一个'''h5py.File'',以便它有一个attrs属性的数据集项?或者你是否要求测试'''create_attrs'''的最佳方式? – wwii 2014-09-25 19:04:25

回答

2

惩戒h5py.File

class HdfWriter(): 
    def __init__(self,hdf_file): 
     self.hdf_file=hdf_file 

    def create_attrs(self,attributes): 
     dset_name=attributes.keys()[0] 
     attrs=attributes[dset_name] 

     for key in attrs: 
      self.hdf_file[dset_name].attrs[key]=attrs[key] 

为目的create_attrs方法,hdf_file表现为一个字典,它返回一个也像字典一样行为的对象。文档很清楚地解释了如何模拟字典。

你需要有一个attrs属性,它的行为像字典的模拟:

import mock 

attrs_d = {} 
def setattrs(name, value): 
## print 'setattrs', name, value 
    attrs_d[name] = value 
def getattrs(name): 
## print 'getattrs', name 
    return attrs_d[name] 
mock = mock.MagicMock() 
mock.attrs.__setitem__.side_effect = setattrs 
mock.attrs.__getitem__.side_effect = getattrs 

您需要为hdf_file一个模拟其行为类似字典和将返回上面创建的模拟对象。

hdf_d = {'test_dset':mock} 
def getitem(name): 
## print 'getitem', name 
    return hdf_d[name] 
def setitem(name, value): 
    hdf_d[name] = value 
mock_hdf = mock.MagicMock() 
mock_hdf.__getitem__.side_effect = getitem 
mock_hdf.__setitem__.side_effect = setitem 

hdf_d,如实施,只适用于关键'test_dset'。根据您的需要,getitems可能会更好地返回mock,而不考虑名称参数。

def test_if_attr_is_initialized(mock_hdf): 
    writer=HdfWriter(mock_hdf) 
    attr={'test_dset':{'test_field':'test_value'}} 
    writer.create_attrs(attr) 
    print writer.hdf_file['test_dset'].attrs['test_field'], '==', attr['test_dset']['test_field'] 

    assert writer.hdf_file['test_dset'].attrs['test_field']=='test_value' 

test_if_attr_is_initialized(mock_hdf) 

>>> 
test_value == test_value 
>>> 

这应该足以测试create_attrs但它可能不是最优的 - 也许有人会附和一些改进。

+1

非常感谢您花时间去解决这个问题......我非常感谢这一点。我刚开始学习嘲笑技巧。 – Chris 2014-09-26 07:22:53