【发布时间】:2011-12-07 07:40:46
【问题描述】:
我正在为这样的现有代码编写单元测试
class someClass {
public function __construct() { ... }
public function someFoo($var) {
...
$var = "something";
...
$model = new someClass();
model->someOtherFoo($var);
}
public someOtherFoo($var){
// some code which has to be mocked
}
}
在这里我应该如何模拟对函数“someOtherFoo”的调用,使其不会在someOtherFoo 内执行“some code”?
class someClassTest {
public function someFoo() {
$fixture = $this->getMock('someClass ', array('someOtherFoo'));
$var = "something";
....
// How to mock the call to someOtherFoo() here
}
}
是否可以模拟构造函数,使其返回我自己构造的函数或变量?
谢谢
【问题讨论】:
-
你想要达到什么目的?为什么要模拟
someFoo而不是对其进行测试? -
我正在尝试测试函数
test()。为了使其可单元测试,我想模拟对someFoo()的调用,以便我可以测试函数test而不依赖于someFoo。这对你有意义还是我应该再举一个例子?谢谢 -
我想我会测试
one::someFoo(),然后测试one::test();如果您已经测试过one::someFoo(),那么one::test()依赖它并不重要,不是吗?毕竟,这就是在实际使用中会发生的事情。我理解您为什么要模拟数据库连接或 HTTP 客户端,但我并没有真正看到这里的问题。您可以添加一个静态属性$mocking和一个one::setMocking(true),然后在one::someFoo()方法中添加if (self::$mocking) return;,在您的测试用例中打开或关闭标志。 -
你是对的。我可以在这里做。但问题是这是遗留代码,所以我不知道我需要更改多少地方。
-
Sumtik,第一手测试遗留代码从来都不是一件简单的事情。这主要是因为遗留代码没有测试。你正在改变这个,所以这是一些工作。从一个类开始,看看它是如何工作的。