Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Yii - Model Unittesting an upload form

Tags:

phpunit

yii

I have the following uploadform model

class TestUploadForm extends CFormModel
{
public $test;

public function rules()
{
    return array(
        array(test, 'file', 'types' => 'zip, rar'),
    );
}

My Question is, how can I unit test this? I've tried something like:

public $testFile = 'fixtures/files/yii-1.1.0-validator-cheatsheet.pdf';

public function testValidators()
{
    $testUpload = new TestUploadForm;

    $testUpload->test = $this->testFile ;
    assertTrue($testUpload ->validate());

    $errors= $testUpload ->errors;
    assertEmpty($errors);
}

However, That keeps telling me the field hasn't been filled in. How can I properly unit test the extension rules?

like image 958
SnIpY Avatar asked Apr 29 '12 06:04

SnIpY


Video Answer


1 Answers

As we know that Yii uses CUploadedFile, for file uploads, we have to use it to initialize the file attribute of the model.

We can use the constructor to initialize the file attribute new CUploadedFile($names, $tmp_names, $types, $sizes, $errors);

Hence we can do this:

public ValidatorTest extends CTestCase{

    public $testFile = array(
       'name'=>'yii-1.1.0-validator-cheatsheet.pdf',
       'tmp_name'=>'/private/var/tmp/phpvVRwKT',
       'type'=>'application/pdf',
       'size'=>100,
       'error'=>0
    );

    public function testValidators()
    {
       $testUpload = new TestUploadForm;

       $testUpload->test = new CUploadedFile($this->testFile['name'],$this->testFile['tmp_name'],$this->testFile['type'],$this->testFile['size'],$this->testFile['error']);
       $this->assertTrue($testUpload->validate());

       $errors= $testUpload->errors;
       $this->assertEmpty($errors);
    }
}

The CFileValidator takes into account the file extension for determining type, so to test your validator you'll have to keep changing the name of the $testFile, i.e $testFile['name']='correctname.rar'.

So finally we do not really need a file anywhere, just the info of the file is enough to test.

like image 163
bool.dev Avatar answered Oct 15 '22 10:10

bool.dev