标签: phpunit

PHPUnit:获取模拟方法调用的参数

我目前正在开发一个存储敏感数据的项目,因此必须能够根据请求删除它们.

我想测试我的实体(患者)是否使用空电话号码保存到数据库中.首先要做的是:获取传递给的参数PatientDao::savePatient(PatientModel $patient),并查看其phoneNumber属性.

所以这是PatientDao界面:

interface PatientDao {
    function savePatient(PatientModel $patient);
}
Run Code Online (Sandbox Code Playgroud)

以及我的测试文件中的代码:

$this->patientDao                    // This is my mock
            ->expects($this->once()) 
            ->method('savePatient'); // savePatient() must be called once

$this->controller->handleMessage(...);

$patient = ??; // How can I get the patient to make assertions with it ?
Run Code Online (Sandbox Code Playgroud)

我该怎么做,或者有没有其他方法可以确保患者使用空电话号码保存?

php phpunit mocking

14
推荐指数
2
解决办法
1万
查看次数

PHPUnit和MySQL截断错误

我很头疼PHPUnit的行为总是TRUNCATE在插入灯具之前一直运行而没有先设置外键检查:

Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint

基本上,PHPUnit尝试在插入fixture之前截断表.我怎么告诉它SET FOREIGN_KEY_CHECKS=0;

php mysql phpunit

14
推荐指数
1
解决办法
3534
查看次数

PHP单元测试

有没有任何简单的PHP测试框架,可能比simpletest更简单,而不是像PHPUnit那样基于命令行?

php phpunit unit-testing simpletest

13
推荐指数
2
解决办法
1万
查看次数

如何用PHPUnit单元测试异常?

我没有得到如何使用PHPUnit对异常进行单元测试.

请参阅我的方法与异常:

    public function getPhone($html, $tag = 'OFF', $indicative, $number_lenght) {

        // .. code

        if ($tag <> 'OFF') {

            $html = $doc[$tag]->text(); // Apanho apenas o texto dentro da TAG
                if (empty($html)) {
                    throw new Exception("Nao foi possivel apanhar qualquer texto dentro da TAG, Metodo em causa: getPhone()");
                }               
        }

        // .. code
    }
Run Code Online (Sandbox Code Playgroud)

现在我的PHPUnit测试:

<?php

require_once '../Scrap.php';

class ScrapTest extends PHPUnit_Framework_TestCase
{

    protected $scrap;

    // Setup function to instantiate de object to $this->scrap
    protected function setUp()
    {
        $this->scrap = …
Run Code Online (Sandbox Code Playgroud)

php phpunit exception-handling

13
推荐指数
2
解决办法
3万
查看次数

如何检测PHPUnit的版本

我正在使用较旧版本的PHPUnit(3.4)编写单元测试,因此无法使用3.5和3.6手册中列出的所有支持的断言.虽然我可以在我的环境中重新设置测试以获得即时支持,但我想让我的测试依赖于当前版本的PHPUnit,所以只要我或任何其他人的测试环境提供PHPUnit 3.5+,它就会使用assertsInstanceOf() .

我以为会有一些由PHPUnit自动定义的常量,但是我找不到任何关于它的文档.

在调用命令行时,有没有办法实现这一点而不需要定义常量?

php phpunit

13
推荐指数
4
解决办法
1万
查看次数

PHPUnit - 为接口编写测试类,并使用工厂测试对象

我正在编写一个将继承接口的类.将为该接口编写客户端代码,并编写用于支持它的类.我的想法是稍后我将为该接口编写其他类,这两个不同类的对象应该是完全可互换的.我没有为第一个类编写测试类,而是想为接口编写一个.

我的计划是编写一个测试类,它将为构造函数(依赖注入)获取工厂对象,并使用工厂创建被测试类的新实例.

这样,如果我想测试ClassA,我可以将ClassAFactory对象传递给测试类的构造函数,如果我想测试ClassB,我会传递一个ClassBFactory对象.这两个类都是可以互换的,因为只有公共方法应该被测试,这似乎是理想的.

但是测试构造函数呢?我是否会更好地编写一个抽象的测试类,并在继承抽象测试类的类中实现构造函数测试(不同的类可能以不同的方式实例化)?

如果我确实使用了第一个想法,我想我会测试每个被测试的类,例如:

class ClassATest extends [PHPUnit test case]
{
    $myFactory = new ClassAFactory();
    $myTest = new ClassTest($myFactory);

    $myTest->test1();
    $myTest->test2();
    //etc.
}
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?我想要进行一般性测试,这样当我编写新类来实现公共接口时,我可以只使用与其他测试相同的测试对象.但是,看到不同的类会有不同的构造函数,或许编写一个抽象的测试类并为每个新对象扩展它会更好吗?你怎么看?

php oop phpunit unit-testing

13
推荐指数
2
解决办法
6354
查看次数

在Symfony 2.1中单元测试自定义验证约束但不访问容器?

我如何单元测试ContainsItalianVatinValidator自定义验证器,但w*不访问容器*和validator服务(从而创建存根对象)?

class ContainsItalianVatinValidator extends ConstraintValidator
{
    /**
     * @param mixed $value
     * @param \Symfony\Component\Validator\Constraint $constraint
     */
    public function validate($value, Constraint $constraint)
    {    
        if (!preg_match('/^[0-9]{11}$/', $value, $matches)) {
            $this->context->addViolation($constraint->message, array(
                '%string%' => $value
            ));
        }

        // Compute and check control code
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试用例中,我知道我应该访问ConstraintViolationList,但我不知道如何从验证器本身做到这一点:

class ContainsItalianVatinValidatorTest extends \PHPUnit_Framework_TestCase
{
    public function testEmptyItalianVatin()
    {
        $emptyVatin = '';
        $validator  = new ContainsItalianVatinValidator();
        $constraint = new ContainsItalianVatinConstraint();

        // Do the validation
        $validator->validate($emptyVatin, $constraint);

        // …
Run Code Online (Sandbox Code Playgroud)

phpunit symfony symfony-2.1

13
推荐指数
3
解决办法
7386
查看次数

Laravel单元测试控制器

我试图在TDD之后开始一个新的Laravel应用程序

我的第一步是检查主页上是否调用了/ login控制器.

尽管遵循了几个教程我无法让测试工作,但我根本无法看到我做错了什么.

我的设置是:作曲家安装laravel composer来安装phpunit

这是我的路线:

<?php
Route::get('/login', 'AuthenticationController@login');
Run Code Online (Sandbox Code Playgroud)

我的控制器:

<?php

class AuthenticationController extends BaseController {

    public function login () {
        return View::make('authentication.login');
    }

}
Run Code Online (Sandbox Code Playgroud)

我的测试:

<?php

class AuthenticationTest extends TestCase {

    public function testSomeTest () {

        $response = $this->action('GET', 'AuthenticationController@login');

        $view = $response->original;

        $this->assertEquals('authentication.login', $view['name']);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

  ErrorException: Undefined index: name
Run Code Online (Sandbox Code Playgroud)

代码作为一个副本(几乎完全)来自Laravel网站,但它没有运行.

谁能看到我做错了什么?

它声称$ view没有索引名称,但这不能正确,因为它在laravel网站上的示例,加上视图正在使用其名称呈现(它也在前端正确显示)

编辑::

因此,从评论中可以看出,laravel单元测试部分不清楚,$ view ['name']正在检查名为$ name的变量.如果是这种情况,您如何测试使用的控制器/路由,IE.什么控制器名称/操作名称已用于路由('X')

php phpunit unit-testing laravel-4

13
推荐指数
1
解决办法
2万
查看次数

PHPUnit不使用Laravel 5

我刚刚安装了一个新的Laravel 5项目,这是我在这个版本上的第一个项目.PHPUnit应该是开箱即用的框架和我看到的每个教程只是phpunit在项目文件夹中键入以启动单元测试.

我检查过,PHPUnit在composer.json,我也做了一个composer install,composer update以防万一它不会在这里

website(master)$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Removing phpunit/phpunit (4.6.1)
  - Installing phpunit/phpunit (4.6.2)
    Downloading: 100%
Run Code Online (Sandbox Code Playgroud)

但它根本不起作用根本不phpunit被认可

 website(master)$ phpunit
-bash: phpunit: command not found
Run Code Online (Sandbox Code Playgroud)

似乎没有人在谷歌搜索之前就遇到过这个问题.我希望我没有犯任何愚蠢的错误.有什么想法或建议吗?多谢你们 ;)

php phpunit laravel-5

13
推荐指数
3
解决办法
1万
查看次数

如何从PHPUnit Test setUp运行Laravel数据库播种机?

我试图在一些PHPUnit测试用例中的每次测试之前重新创建数据库.我正在使用Laravel 5.3.这是TestCase:

class CourseTypesTest extends TestCase
{
    public function setUp()
    {
        parent::setUp();
        Artisan::call('migrate');
        Artisan::call('db:seed', ['--class' => 'TestDatabaseSeeder ', '--database' => 'testing']);
    }

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function test_list_course_types()
    {
        $httpRequest = $this->json('GET', '/api/course-types');
        $httpRequest->assertResponseOk();
        $httpRequest->seeJson();

    }

    public function tearDown()
    {
        Artisan::call('migrate:reset');
        parent::tearDown();
    }
}
Run Code Online (Sandbox Code Playgroud)

运行phpunit失败并显示错误:

由Sebastian Bergmann和贡献者提供的$ phpunit PHPUnit 5.7.5.

E 1/1(100%)

时间:2.19秒,内存:12.00MB

有1个错误:

1)CourseTypesTest :: test_list_course_types ReflectionException:类TestDatabaseSeeder不存在

D:\ www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Container\Container.php:749 D:\ www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Container\Container.php:644 D:\ www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Foundation\Application.php:709 D:\ www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Database\Console\Seeds\SeedCommand.php:74 D:\ www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Database\Console\Seeds\SeedCommand.php:63 D:\ …

phpunit laravel laravel-5 laravel-seeding

13
推荐指数
3
解决办法
7342
查看次数