我正在尝试在类上测试静态方法,但它依赖于静态数组属性,它不会在测试之间重置,所以我可以创建一个模拟类&对此进行测试。
唯一的问题是mock类静态方法没有像原始静态方法那样返回值。
这是我的班级......
class Thing {
static public function doThing() {
return 'yeah!';
}
}
......这里是测试班......
class ThingTest {
public function testDoSomething() {
$mock_class = $this->getMockClass('Thing');
$this->assertEqual('yeah!', $mock_class::doThing())
}
}
此测试失败,并显示消息“无法断言null匹配预期'是啊!'。”
我在这里缺少什么?我认为没有在getMock()调用上指定方法意味着原始方法结转,但显然不是。 :O(
任何指针都会很棒。感谢。
我从内存中输入了这个内容,而不是复制代码,因为我进行了进一步的更改以尝试解决此问题。在为模拟对象编写更多测试之后,我意识到如果你将array()作为第二个参数($ methods)传递给getMock [Class],那么它会删除所有方法,&我相信这就是我实际做过的事情。我这样做,因为我也想在第三个参数中传递构造函数参数。代码可能看起来更像......
class ThingTest {
public function testDoSomething() {
$mock_class = $this->getMockClass(
'Thing',
array(),
array( 'something' )
);
$this->assertEqual('yeah!', $mock_class::doThing())
}
}
答案 0 :(得分:0)
也许$mock_class
是一个对象,而不是字符串类名?尝试使用下一个:
class ThingTest {
public function testDoSomething() {
$mock_class = $this->getMockClass('Thing');
$this->assertEqual('yeah!', Thing::doThing())
}
}
这有用吗?
答案 1 :(得分:0)
您不应该模拟包含要测试的方法的类。如果您模拟了类,则在未通过
定义之前不能调用任何方法-> expects('methodName')
-> with($this->equalTo($parameter),[$this->equalTo($parameter2),...])
-> will($this->returnValue($value))
。模拟用于降低测试的复杂性。假设你想测试一个如下所示的函数:
class test{
private $someClass;
public function __construct(SomeInterface $someClass){
$this -> someClass = $someClass;
}
public function test(){
$someVariable = $this -> someClass -> doSomething();
changeSomething($someVariable);
return $someVariable;
}
}
如果你不模拟someClass,你必须测试someClass的整个代码 - >做一点事。但那不是你想要做的。你只想使用函数doSomething的返回。这就是你需要模拟的地方。它降低了测试的复杂性,并提供REAL UNIT测试,而不是测试整个应用程序。
所以你需要做的是:
class ThingTest {
public function testDoSomething() {
$class = new Thing();
$this->assertEquals('yeah!', $class::doThing());
}
}
不需要模拟。
答案 2 :(得分:0)
您忘了按PHPUnit_Framework_TestCase
延长。
class ThingTest extends PHPUnit_Framework_TestCase {
public function testDoSomething() {
$mock_class = $this->getMockClass('Thing');
$this->assertEqual('yeah!', $mock_class::doThing())
}
}