Yii Framework Forum: testIsInRole() unit test fails with SQL Server - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

testIsInRole() unit test fails with SQL Server Chapter 8 - Page 199

#1 User is offline   Ricardo Duarte 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 2
  • Joined: 01-August 12

Posted 01 August 2012 - 06:42 PM

I'm using SQL Server instead of MySQL and when I try to pass the unit test in ProjectTest.php the test fails in testIsInRole()...

public function testIsInRole()
{
 	$row1 = $this->projUserRole['row1'];
 	Yii::app()->user->setId($row1['user_id']);
 	$project=Project::model()->findByPk($row1['project_id']);
 	$this->assertTrue($project->isUserInRole('member'));
}


When I run the test I get the following...

% phpunit unit/ProjectTest.php
...
Time: 1 second, Memory: 10.00Mb
There was 1 failure:

1) ProjectTest::testIsInRole
Failed asserting that false is true.
...
FAILURES!
Tests: 7, Assertions: 16, Failures: 1.


I solved the failure but I'm newbie on Yii and I want to know if the solution is right.

[SOLUTION]

The fails occurs on Project::isUserInRole() method, exactly in the return, when calls the execution of the query:

public function isUserInRole($role)
{
 	$sql = "SELECT role FROM tbl_project_user_role WHERE project_id=:projectId AND user_id=:userId AND role=:role";
 	$command = Yii::app()->db->createCommand($sql);
 	$command->bindValue(":projectId", $this->id, PDO::PARAM_INT);
 	$command->bindValue(":userId", Yii::app()->user->getId(), PDO::PARAM_INT);
 	$command->bindValue(":role", $role, PDO::PARAM_STR);
 	return $command->execute()==1 ? true : false;
}


The problem is that sql statement is a non-query. In the CDbCommand documentation says:

Quote

This method is meant only for executing non-query SQL statement.


CDbCommand::execute() returns the number of rows affected by the DELETE, INSERT, or UPDATE statement executed by the corresponding statement object. If the SQL statement executed was a SELECT, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases. SQL Server does not return the number of rows affected by a SELECT statement.

Instead, I used CDbCommand::queryScalar() with a SELECT COUNT(*) statement to retrieve the number of rows that will be returned.

My final Project::isUserInRole() method is as follows:

public function isUserInRole($role)
	{
    	$sql = "SELECT COUNT(role) AS num_rows  FROM project_user_role WHERE project_id=:projectId AND user_id=:userId AND role=:role";
    	$command = Yii::app()->db->createCommand($sql);
    	$command->bindValue(":projectId", $this->id, PDO::PARAM_INT);
    	$command->bindValue(":userId", Yii::app()->user->getId(), PDO::PARAM_INT);
    	$command->bindValue(":role", $role, PDO::PARAM_STR);

    	return $command->queryScalar() == 1 ? true : false;
}


Note that I added the COUNT statement to the query and I replaced $command->excecute() by $command->queryScalar() and now when I run phpunit the test pass OK.

% phpunit unit/ProjectTest.php
PHPUnit 3.6.11 by Sebastian Bergmann.
...
Time: 1 second, Memory: 10.00Mb
OK (7 tests, 16 assertions)


What do you think about this solution? Is there another way to solve this?
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users