2010-11-12 61 views
1

我有问题模拟对象来测试描述符。Python:模拟实例的问题

这是描述符的代码:

class Text(object): 
    def __init__(self, default_value=u'', validators=[]): 
     self.validators = validators 
     self._value = default_value 

    def __set__(self, instance, value): 
     for validator in self.validators: 
       validator(value).validate() 

这是测试:

def test_text_validator_raises_exception(self): 
    validator = Mock() 
    validator.validate.side_effect = ValidationError() 
    text = Text(validators=[validator]) 
    self.assertRaises(ValidationError, text__set__, (text, '')) 

编辑: 的功能有()在我做了一个错字复制代码时代码。

我得到的错误是集合()需要3个参数。但我注意到答案中我不应该把一个元组作为最后一个参数。

但是当我在测试函数中调用验证器('').validate()时它也不起作用。

+3

你的问题是什么? – khachik 2010-11-12 19:31:16

+0

对不起,应该已经更清楚了。 – Pickels 2010-11-12 22:35:16

回答

3
  • Textvalidator是一个对象工厂如类对象
  • validatortest_..功能作为一个具体的实例 - 产品一个对象工厂。

你应该给Text()的东西,与.validate方法返回一个对象而不是对象本身:

def test_text_validator_raises_exception(self): 
    validator = Mock() 
    validator.validate.side_effect = ValidationError() 
    text = Text(validators=[Mock(return_value=validator)]) 
    self.assertRaises(ValidationError, text.__set__, text, '') 
+0

这实际上是我想问的。试图找出如何让模拟返回一个类而不是一个对象。在你的例子中,不Mock(return_value = validator)也返回对象的实例而不是类? – Pickels 2010-11-12 22:49:31

+0

尝试了它,它的工作原理,非常感谢。当我匆匆忙忙地尝试并不再提出任何问题时,因为这一切都变得有点混乱。再次感谢。 – Pickels 2010-11-12 23:13:40

+1

@Pickels:考虑:'f = Mock(return_value = validator)'。这里'f'是一个当你调用它时返回'validator'的对象,例如'f(value)== validator'。 Python中的'f'和'f()'是不同的东西。 – jfs 2010-11-13 02:38:38

1

我猜你需要把()后函数名

+0

是的,'def test_text_validator_raises_exception'肯定需要'()'。 – Constantin 2010-11-12 20:00:44

+0

是的,对不起,我的代码中的函数有括号。 – Pickels 2010-11-12 22:33:54

0

也许嘲笑一个实例最好的办法就是“你自称是实例?”

严重的是,虽然,def test_text_validator_raises_exception:def test_text_validator_raises_exception():

但你用它有什么问题,作为第一个评论者问?