mocking - 关于模拟 PDO 类的问题
问题描述
在 setUp() 函数内部我想使用 PDOMock 类,定义如下
namespace TddProject;
class PDOMock extends \PDO
{
public function __construct() {}
}
但是当我运行测试时,我得到了这个错误:
Argument 1 passed to TddProject\InvoiceManager::__construct() must be an instance of PDO, instance of Mock_PDOMock_7d3c9396 given, called in /Applications/MAMP/htdocs/tdd_project/tests/InvoiceManagerTest.php on line 35 and defined
/Applications/MAMP/htdocs/tdd_project/src/InvoiceManager.php:16
InvoiceManager 类有这个构造函数:
public function __construct(\PDO $db)
{
$this->db = $db;
}
PDOMock 似乎不可见。你能建议我如何解决这个问题吗?谢谢
编辑:
这是完整的测试类:
<?php
use TddProject\Customer;
use TddProject\Invoice;
use TddProject\InvoiceManager;
class InvoiceManagerTest extends PHPUnit_Framework_TestCase
{
private $stmMock;
private $pdoMock;
public function setUp()
{
$this->stmMock = $this->getMock('PDOStatement', array('execute','fetch'));
$this->stmMock->expects($this->any())->method('execute')
->will($this->returnValue(true));
$this->pdoMock = $this->getMock('PDOMock', array('prepare','lastInsertId'));
$this->pdoMock->expects($this->any())->method('prepare')
->will($this->returnValue($this->stmMock));
}
public function testRaiseInvoice() {
$this->pdoMock->expects($this->once())
->method('lastInsertId')->will($this->returnValue(1));
$invoiceManager = new InvoiceManager($this->pdoMock);
$product1 = new \TddProject\Product();
$product1->price = 10;
$product1->product_id = 1;
$customer = new Customer();
$customer->customer_id = 1;
$invoice = new Invoice();
$productsArray = array(array(
'product' => $product1,
'quantity' => 2
));
$invoiceManager->raiseInvoice($invoice, $customer, $productsArray);
$this->assertEquals(20, $invoice->price_total);
}
}
解决方案
我通过删除 InvoiceManager 构造函数声明中的参数类型解决了这个问题。
推荐阅读
- javascript - 如何在不禁用ckeditor工具栏的情况下禁用写作?
- javascript - 为什么 Java Script 嵌套循环出错了?
- logback - 如何使用带有 Logback 的 SLF4J MDC 指定 MDC 字段类型?
- java - 在android studio中接收IMEI时显示错误
- php - Laravel 检查多个字段的唯一验证
- java - 用户单击按钮后,如何覆盖当前的 EditText 输入?
- python - 如何使用线程让一个动作等待另一个动作完成后再继续?
- javascript - Javascript 变量通过引用发生变化 - 我该如何解决这个问题?
- ubuntu - Ubuntu 20.04 启动到 initramfs
- node.js - 节点 Bcrypt 比较总是返回成功