CakePHPで、私は2つのモデルを作成しました。1つは請求書で、もう1つは製品です。製品との請求書「hasMany」の関連付け。請求書には、「validateCreateInvoice」や「validateUpdateInvoice」などの検証セットがいくつかあります。
検証セットを単体テストするために、以下のようなPHPUnitテストケースを作成しています。では、1)検証セットを動的に設定する方法は?2)PHPUnitからモデルと関連モデルを検証しますか?
次のコードを実行しました。マーチャントの電子メールと製品名のデータ検証は失敗するはずです。そうではありません。エラーダンプはnullです。何が問題なのか?注:検証ルールは、モデルの保存方法を通じて完全に機能しています。つまり、検証ルールに問題はありません。
App::import('Model', 'Invoice');
App::import('Model', 'Product');
App::uses('Validation', 'Utility');
App::uses('CakeFixtureManager', 'TestSuite/Fixture');
App::uses('CakeTestFixture', 'TestSuite/Fixture');
require_once 'PHPUnit/Framework/TestCase.php';
require_once 'PHPUnit/Autoload.php';
class InvoiceTest extends PHPUnit_Framework_TestCase {
public $sourceName = 'Invoice';
public function setUp() {
parent::setUp();
$this->Invoice=& ClassRegistry::init('Invoice');
$this->InvoiceValidation =& ClassRegistry::init('Validate');
}
public function tearDown() {
parent::tearDown();
unset($this->Model, $this->Source);
ConnectionManager::drop($this->sourceName);
}
public function testCreate() {
$data = array(
"merchantEmail" => "stest_1339339519_bizyahoo.com", // not a valid email address
"payerEmail" => "stest_1340973819_per@yahoo.com",
"currencyCode" => "USD",
"paymentTerms" => "Net10",
"Products" =>array(
0 => array (
"productName" => "", // product name shouldn't be empty
"description" => "From CocaCola",
"unitPrice" => 1.56,
"quantity" => 1,
"taxName" => "Tax1",
"taxRate" => 7
),
1 => array (
"productName" => "Pepsi1",
"description" => "From Pepsi",
"unitPrice" => 1.65,
"quantity" => 1,
"taxName" => "Tax2",
"taxRate" => 7
),
),
);
//Create Invoice
$invoice=new Invoice();
$invoice->set($data);
$this->Invoice->setValidation('validateCreateInvoice');
$errors = $this->Invoice->validates($data); // validation should fails because of invalid merchant email address
Debugger::dump($errors); // output is null
$errors1 = $this->Invoice->validateAssociated($data); // validation should fail because product name is empty
Debugger::dump($errors1); // output is null
}
}