2013-01-12 66 views
1

如果我有一个与类B交互的类A,那么在我的测试中我想嘲笑类B,以便我可以单独测试类A.getMock - 同一类的多个实例

这很容易在PHPUnit中使用"getMock('classname')"

我的问题目前是:如果class A使用的class B多个实例,因为它看起来"getMock"不会返回,如果多次调用但总是class B同一模拟多个实例我不能"getMock('B')"模拟此。

下面的例子:

<?php 

class A() 
{ 
    private class_b_1; 
    private class_b_2; 


    public function setClassB1(B $class_b) 
    { 
     $this->class_b_1 = $class_b; 
    } 

    public function setClassB2(B $class_b) 
    { 
     $this->class_b_2 = $class_b; 
    } 
} 

而且在我的测试:

$mock_one_of_class_b = $this -> getMock('B'); 
$mock_two_of_class_b = $this -> getMock('B'); 

然后$mock_one_of_class_b是相同的对象$mock_two_of_class_b

我该如何用PHPUnit模拟一个类的多个实例?

在此先感谢!

回答

3

实际上,getMock方法创建了模拟类的不同实例。看看这个例子:

class Foo 
{ 
    protected $value; 

    public function setValue($value) 
    { 
     $this->value = $value; 
    } 

    public function getValue() 
    { 
     return $this->value; 
    } 
} 

现在,我们为它创建测试:

class FooTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testFoo() 
    { 
     $a = $this->getMock('Foo', array('someNonExistingMethod')); 
     $b = $this->getMock('Foo', array('someNonExistingMethod')); 

     $a->setValue(1); 
     $b->setValue(234); 

     $this->assertEquals(1, $a->getValue(), 'This test will fail if "a" and "b" objects are the same'); 
    } 
} 

注重在getMock方法的第二个参数。在这个论点中,你告诉phpunit哪些方法会被模拟。如果你根本没有通过任何论证 - 那么phpunit假设你想模拟来自对象的所有方法。所以,如果你通过array('someNonExistingMethod')那么就不会有任何模拟方法(在调用时会调用“真实”方法)。