作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我怀疑我的问题的“最佳”答案是使用依赖注入(inject)并完全避免该问题。不幸的是我没有那个选项...
我需要为一个导致第三方库被实例化的类编写测试。我想模拟/ stub 库类,这样它就不会进行实时 API 调用。
我在 CakePHP v3.x 框架中使用 phpunit。我能够模拟库并创建 stub 响应,但这并不能阻止“真实”类被我的测试之外的代码实例化。我考虑过尝试模拟实例化上游的类,但是它们很多,这会使测试编写/维护起来非常笨拙。
有没有办法以某种方式“ stub ”类的实例化?类似于我们可以告诉 php 单元期待 API 调用并预设返回数据的方式?
最佳答案
使用 PHPUnit,您可以获得 API 类的模拟。然后您可以指定它将如何与使用的方法和参数进行交互。
这是来自 phpunit.de 站点(第 9 章)的示例:
public function testObserversAreUpdated()
{
// Create a mock for the Observer class,
// only mock the update() method.
$observer = $this->getMockBuilder('Observer')
->setMethods(array('update'))
->getMock();
// Set up the expectation for the update() method
// to be called only once and with the string 'something'
// as its parameter.
$observer->expects($this->once())
->method('update')
->with($this->equalTo('something'));
// Create a Subject object and attach the mocked
// Observer object to it.
$subject = new Subject('My subject');
$subject->attach($observer);
// Call the doSomething() method on the $subject object
// which we expect to call the mocked Observer object's
// update() method with the string 'something'.
$subject->doSomething();
}
如果 API 返回一些东西,那么您可以将 will() 添加到第二个语句中,如下所示:
->will($this->returnValue(TRUE));
关于php - 如何抢先模拟一个被另一个类实例化的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35188219/
请查看第 19 章中的 two-in-a-row*? 函数。 我的问题是关于 get-first 辅助函数中的 (leave '())。请注意,(waddle l) 将返回 '() 或一个原子,这表明
请查看第 19 章中的 two-in-a-row*? 函数。 我的问题是关于 get-first 辅助函数中的 (leave '())。请注意,(waddle l) 将返回 '() 或一个原子,这表明
我是一名优秀的程序员,十分优秀!