我是PHP / PHPunit的新手,我需要一些帮助! 我正在开发一个OpenCart项目,我使用PHPunit进行单元测试。我需要测试ModelSaleCustomer(admin \ model \ sale \ customer.php)的类扩展了Model类(system \ engine \ model.php)。我在运行单元测试时遇到了这个错误。
Error 这是我创建的类测试:
require_once 'C:\xampp\htdocs\IDOtest\system\engine\model.php';
require_once 'C:\xampp\htdocs\IDOtest\admin\model\sale\customer.php';
class ModelSaleCustomerTest extends PHPUnit_Framework_TestCase {
protected $object;
protected function setUp() {
$this->object = new ModelSaleCustomer();
}
protected function tearDown() {
}
public function testAddCustomer() {
$expected = 3;
$content=array ('customer_group_id'=>'1', 'firstname' =>'bnhung', 'lastname'=>'nguyen','email'=>'nhungbng@gmail.com','telephone'=>'012345670','fax'=>'123456','custom_field'=>'', 'newsletter'=>'','salt'=>'','password'=>'1234', 'status'=>'','approved'=>'','safe'=>'','date_added'=>'');
$result = $model->addCustomer($content);
//$actual= $this->object->addCustomer($content);
$this->assertEquals($expected,$actual);
这是班级模型
abstract class Model {
protected $registry;
public function __construct($registry) {
$this->registry = $registry;
}
public function __get($key) {
return $this->registry->get($key);
}
public function __set($key, $value) {
$this->registry->set($key, $value);
}
}
这是我需要测试的课程
class ModelSaleCustomer extends Model {
public function addCustomer($data) {
$this->db->query("INSERT INTO " . DB_PREFIX . "customer SET customer_group_id = '" . (int)$data['customer_group_id'] . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', custom_field = '" . $this->db->escape(isset($data['custom_field']) ? serialize($data['custom_field']) : '') . "', newsletter = '" . (int)$data['newsletter'] . "', salt = '" . $this->db->escape($salt = substr(md5(uniqid(rand(), true)), 0, 9)) . "', password = '" . $this->db->escape(sha1($salt . sha1($salt . sha1($data['password'])))) . "', status = '" . (int)$data['status'] . "', approved = '" . (int)$data['approved'] . "', safe = '" . (int)$data['safe'] . "', date_added = NOW()");
$customer_id = $this->db->getLastId();
if (isset($data['address'])) {
foreach ($data['address'] as $address) {
$this->db->query("INSERT INTO " . DB_PREFIX . "address SET customer_id = '" . (int)$customer_id . "', firstname = '" . $this->db->escape($address['firstname']) . "', lastname = '" . $this->db->escape($address['lastname']) . "', company = '" . $this->db->escape($address['company']) . "', address_1 = '" . $this->db->escape($address['address_1']) . "', address_2 = '" . $this->db->escape($address['address_2']) . "', city = '" . $this->db->escape($address['city']) . "', postcode = '" . $this->db->escape($address['postcode']) . "', country_id = '" . (int)$address['country_id'] . "', zone_id = '" . (int)$address['zone_id'] . "', custom_field = '" . $this->db->escape(isset($address['custom_field']) ? serialize($address['custom_field']) : '') . "'");
if (isset($address['default'])) {
$address_id = $this->db->getLastId();
$this->db->query("UPDATE " . DB_PREFIX . "customer SET address_id = '" . (int)$address_id . "' WHERE customer_id = '" . (int)$customer_id . "'");
}
}
}
}
答案 0 :(得分:0)
它可以帮助您:About Mocking。 我认为你可以模拟一个类模型来隔离它,或者你可以在你的评论中喜欢
说书:
说添加
new ModelSaleCustomer($regsitry);
答案 1 :(得分:0)
我写了一些有关评论的工作问题:
class ModelSaleCustomerTest extends PHPUnit_Framework_TestCase
{
protected $object;
protected function setUp()
{
define('DB_PREFIX', '');
$mockRegistry = $this->getMock('Registry', ['get']);
$db = $this->getMock('db', ['query', 'getLastId', 'escape']);
// Stub our "$this->db"
// 1. Db stub expects call of "query" method
$db->expects($this->any())
->method('query')
->willReturn(true);
// 2. Db stub expects call of "escape" method
$db->expects($this->any())
->method('escape')
->willReturn('stub');
// 3. Db stub expects call of "getLastId" method
$db->expects($this->any())
->method('getLastId')
->willReturn(3);
// Stub registry, which should contain $db and return it on "get" method call
$mockRegistry->expects($this->any())
->method('get')
->willReturn($db);
$this->object = new ModelSaleCustomer($mockRegistry);
}
public function testAddCustomer()
{
$content = array(
'customer_group_id' => '1',
'firstname' => 'bnhung',
'lastname' => 'nguyen',
'email' => 'nhungbng@gmail.com',
'telephone' => '012345670',
'fax' => '123456',
'custom_field' => '',
'newsletter' => '',
'salt' => '',
'password' => '1234',
'status' => '',
'approved' => '',
'safe' => '',
'date_added' => '',
);
$result = $this->object->addCustomer($content);
// Next line commented, because "addCustomer" actually doesn't return anything
// $this->assertEquals($expected, $actual);
}
}
你可以从这里开始。
P.S。使用PHPUnit 5.0.3进行测试