PHPUnit:如何保存传递给stub方法的参数

方法setValue()在类SomeClass中接受参数,并且无法为make断言获取此参数.

我可以为方法setValue()创建一个存根,它允许保存传递给此方法的参数吗?

class SomeClass {
  public function setValue($name, $value)
  {
    // do some stuff
  }
  public function doSomething(array $values)
  {
    foreach ($values as $name=>$value) {
      $this->setValue($name, trim($value));
    }
  }
}

class TestSomeClass extends PHPUnit_Framework_TestCase {
public function testDoSomething() { $mock = $this->getMock('SomeClass', array('setValue')); $mock->doSomething(array('v1'=>' string ')); // here need I need assert like this $this->assertEquals('string', $argumentPassedToSetValue); } }

关于如何测试设置是否有效,请参阅@Gordons回答.

我想说你不需要测试它.

您的单元测试应确保您的类的公共API按预期工作.您不关心(为了测试)如何在内部存储您的值,因此您不需要对其进行断言.这样做也会使您的测试只测试您的课程所做的事情而不是课程的方式

关键是你不必在改变你的课程时改变测试而不影响它的作用

为了论证,让我们说SomeClass最终会吐出HTML.

class SomeClass {
  public function setValue($name, $value)
  {
    // do some stuff
  }

  public function doSomething(array $values)
  {
    foreach ($values as $name=>$value) {
      $this->setValue($name, trim($value));
    }
  }

  public function createHTML() 
  {
    $return = "";
    foreach($this->values as $key => $value) { 
         $return .= "<div is='$key'>$value</div>"; 
    }
    return $return;
  }

}

如果这是你的类所做的一切,那么该类的绝对足够的测试可能如下所示:

class SomeClassTest extends PHPUnit_Framework_TestCase {

    public function testHtmlGenerationWithTwoValuesSet() {
        $o = new SomeClass();
        $o->setValue("foo", "bar");
        $o->setValue("x", "y");
        $result = $o->createHTML();
        $this->assertSame(
             2,
             substr_count("<div>", $result),
             "There should be as many divs as there are values set"
        );
        $this->assertTrue(
             strpos("<div>bar</div>") !== false
             "String should contain a set value enclosed in divs"
        );
    }

}

再说一遍:它是关于测试你的类的行为,而不是测试每个方法本身.如果以这种方式实现它,您的测试套件将更有价值

虽然使用html的示例可能不是正确的,但它显示了如何很好地测试行为(我希望)

相关文章
相关标签/搜索