标签: phpunit

如何在PHP中重新创建我的数据库(例如,用于单元测试)

我如何从PHP,重新创建我的数据库,可能插入默认数据.目前,我打算使用单元测试的行为.

我使用Doctrine 2,Zend Framework 1.11 Zend_Test进行单元测试

我可以使用CLI

doctrine orm:schema-tool:update --force
Run Code Online (Sandbox Code Playgroud)

要么

doctrine orm:schema-tool:drop --force
doctrine orm:schema-tool:create
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个PHP替代品,到目前为止找到了这个

但它看起来像

$tool = new \Doctrine\ORM\Tools\SchemaTool($em);
$classes = array(
  $em->getClassMetadata('Entities\User'),
  $em->getClassMetadata('Entities\Profile')
);
$tool->dropSchema($classes, \Doctrine\ORM\Tools\SchemaTool::DROP_DATABASE);
$tool->createSchema($classes);
Run Code Online (Sandbox Code Playgroud)

而且我真的不想指定模型类,尤其是当它们可以改变时.它应该只读取下面...中指定的所有类...就像使用CLI一样,您不需要指定所需的类?

$driverImpl = $config->newDefaultAnnotationDriver(array(realpath('../models')));
$config->setMetadataDriverImpl($driverImpl);
Run Code Online (Sandbox Code Playgroud)

php phpunit zend-framework zend-test doctrine-orm

7
推荐指数
1
解决办法
1224
查看次数

可测试代码 - 小应用示例

我一直在花时间去理解编写可测试代码背后的方法,我偶然发现了Misko Hevery的一篇好文章,他清楚地解释了如何在应用程序构建中处理依赖关系,例如使用工厂加载所有对象,从而减少行使测试复杂化的依赖项

在他的帖子中,他提供了一个最小但尽管很有见地的例子,说明了他如何在java中设置应用程序,以下无耻地引用了以下内容:

// Your main should look like this:
class Main {
  public static void main(String…args) {
    AppFactory factory = new AppFactory(args);
    MyApp app = factory.create();
    app.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后他说:

请注意代码如何分为三个阶段.创建工厂,创建应用程序,运行应用程序 这使得它可以测试.无论你的应用是什么,你都应该放弃这种模式.为了让单例到正确的位置,Factory只创建一个实例,然后在调用new时将该实例传递给所有类的构造函数.请参阅:http://misko.hevery.com/2009/03/30/collaborator-vs-the-factory/

我不擅长Java,但是假设这可以在php中模仿,当然减去main()方法,但是在网络应用程序的上下文中$ args会来自哪里?和初始化?

我会非常有兴趣在PHP中看到一个最小的可测试应用程序示例,甚至是那些认为测试效率高的应用程序的链接.初始化是我很好奇的,主要是.我的目的不是复制粘贴,而是从经验丰富的OOP编码器提供的内容中学习.

我翻过几个流行代码库的代码:Zend,Symphony,但这些框架不是可运行的应用程序,看起来"太快太快",让我无法掌握清晰的画面.此外,在有关测试实践的框架中也指出了一些不足之处.只是一个小例子,如果可能的话(即使不可运行)会让我在从头开始创建一个小应用程序时更好地掌握正确的OOP代码布局实践.

php phpunit

7
推荐指数
1
解决办法
1360
查看次数

用PHPUnit测试抽象类的方法

我有一个抽象类,其中包含常用方法,我希望测试,所以我不必在扩展此类的每个类中继续测试它们.

abstract class Class1 implements iClass1
{
    const VALUE = 'A';
    private $Return;    
    public function __construct($Field = NULL)
    {
        if( ! is_null($Field) )
            $this->SetField($Field);
    }
    public function GetField()
    {
        return $this->Return;
    }
    public function SetField($Field)
    {
        if (strlen($Field) != 3)
        throw new CLASS1_EXCEPTION('Field "' . $Field . '" must be 3 digits.');

    $this->Return = $FieldCode;
    }
    abstract function CalculateData();
}
Run Code Online (Sandbox Code Playgroud)

我想创建基本的测试用例,然后测试构造函数,GetField和其他函数,然后我的其他测试文件可以测试抽象函数.

我希望能够测试const没有改变,字段抛出异常等...

测试:

class TEST_CLASS1 extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        require_once('CLASS1.php');
    }
    public function testConstants()
    {
        $this->assertEquals(CLASS1, 'A'); …
Run Code Online (Sandbox Code Playgroud)

phpunit

7
推荐指数
1
解决办法
6597
查看次数

模拟框架返回具有不同名称和类型的类

我正在尝试创建一个模拟来满足使用此代码的类型提示(Mockery):

return \Mockery::mock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)

或者这个(PHPUnit):

return $this->getMock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)

但返回的模拟称为Mockery\Mock ObjectMock_iFileSystemWrapper_a5f91049.当它不是我需要的任何一个框架的实例时,我该如何键入检查?

为什么模拟框架试图加载真正的类?如果我想要真正的课程,我会包括真正的课程.

这个问题在编写测试时已经减慢了很多次,我只是抛出类型暗示窗口并检查类名,或者只是使用生产对象,因为模拟很难使用.

php phpunit unit-testing mocking mockery

7
推荐指数
1
解决办法
414
查看次数

Symfony 2:如何正确测试Doctrine模型?

有没有办法在Symfony 2应用程序中正确单元测试Doctrine模型?现在我正在编写通过控制器的功能测试,以确保我的应用程序正确存储(和CRUDing)数据.但这需要太长时间而且非常糟糕,因为我必须为每个套件设置灯具,并在套件完成后清除数据库.

我如何隔离Entity和EntityRepository单元测试?有关于此的教程吗?

phpunit symfony doctrine-orm

7
推荐指数
1
解决办法
5128
查看次数

Symfony2:对ArrayCollection的测试给出了"无法访问的字段"

在添加ArrayCollection成员的表单的功能测试中,有以下声明:

$ form ['client [members] [1] [fname]'] ='Benny';

使用DOM检查器验证了字段名称.

此行的控制台输出是:

InvalidArgumentException: Unreachable field "members"

G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:459
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:496
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:319
G:\Documents\workspace\sym\src\Mana\ClientBundle\Tests\Controller\ClientControllerTest.php:57
Run Code Online (Sandbox Code Playgroud)

应该使用什么方法来测试添加ArrayCollection成员?

按要求编辑(nb,跟随重定向已开启):

    //link to trigger adding household member form
    $link = $crawler->selectLink('Add household member')->link();
    $crawler = $client->click($link);
    $form = $crawler->selectButton('Add client')->form();
    $form['client[members][1][fname]'] = 'Benny';
    $form['client[members][1][dob]'] = "3/12/1999";
    $crawler = $client->submit($form);
    $this->assertTrue($crawler->filter('html:contains("Client View Form")')->count() > 0);
Run Code Online (Sandbox Code Playgroud)

phpunit symfony

7
推荐指数
2
解决办法
4674
查看次数

Netbeans-PHPUnit"没有执行测试"错误

我是任何一种测试的新手.我刚刚使用这个doc安装了pear和PHPUnit .我使用netbeans 7.3.1.我还安装了skeletongenerator运行此命令:pear install phpunit/PHPUnit_SkeletonGenerator.

按照PHPUnit中的测试中列出的步骤将PHPUnit集成到netbeans中.
Installing PHPUnit该文档部分所述,通过单击我的netbeans search下的按钮可Netbeans->preferences->unit testing识别PHPUnit安装.

我按照所有步骤添加了示例Calculator项目并生成了测试类.我做到了 但是当我通过右键单击Calculator.php文件并选择Test我得到以下结果来运行测试时.

在此输入图像描述

输出窗口没有任何用处:

在此输入图像描述

我不知道可能是什么问题以及如何解决这个问题.

很少有怀疑,认为可能是造成上述问题:
我应该加入Global include pathNetbeans->preferences->general
我需要require_once在Calculator.php文件中添加语句吗?
我是否只需要在某个特定文件夹下创建php项目,或者我放置项目的位置是不重要的?
如何检查PHPUnit是否已正确安装并且正在运行?

还有许多其他症状我甚至无法想到.

谢谢.

php pear phpunit netbeans netbeans-7.3

7
推荐指数
1
解决办法
4831
查看次数

如果找到正则表达式文本,PHPUnit assertTrue?

我正在使用PHPUnit并尝试检查页面上是否存在文本.assertRegExp工作但使用if语句我得到错误Failed asserting that null is true.

我知道$ test返回null,但是如果文本存在,我不知道如何让它返回1或0或true/false?任何帮助都表示感谢.

        $element = $this->byCssSelector('body')->text();
        $test = $this->assertRegExp('/find this text/i',$element);

        if($this->assertTrue($test)){
            echo 'text found';
        }
        else{
            echo 'not found';
        }
Run Code Online (Sandbox Code Playgroud)

php phpunit assert

7
推荐指数
3
解决办法
6513
查看次数

在PHPUnit测试中有没有办法'期望'输出到error_log?

有没有办法在使用phpunit进行单元测试时对从'error_log("Message")调用创建的输出运行测试?

示例代码,我的一个函数使用luhn算法测试信用卡:

if($checkLuhn && ($this->_luhn_check($cardNumber) == false)) {
    error_log(__METHOD__ . " cardNumber failed luhn algorithm check.");
    return false;
}
Run Code Online (Sandbox Code Playgroud)

$ checkLuhn是传入的布尔值,告诉它是否进行检查,如果$ cardNumber通过,_luhn_check()返回true.问题是,我在这个函数中有多个测试可以返回false.我可以在返回值上使用assertEquals,但也想检查抛出错误的原因.

您可以覆盖error_log或以其他方式在单元测试中获取syslog输出吗?

php phpunit unit-testing syslog

7
推荐指数
1
解决办法
2211
查看次数

如何在Laravel 4.1中对auth过滤器进行单元测试?

我想写一个单元测试,应该检查未经身份验证的用户是否可以查看用户列表(他不应该这样做).

我的路线

Route::group(array('prefix' => 'admin'), function() {
    Route::get('login', function() {
        return View::make('auth.login');
    });
    Route::post('login', function() {
        Auth::attempt( array('email' => Input::get('email'), 'password' => Input::get('password')) );
        return Redirect::intended('admin');
    });
    Route::get('logout', 'AuthController@logout');

    Route::group(array('before' => 'auth'), function() {
        Route::get('/', function() {
            return Redirect::to('admin/users');
        });
        Route::resource('users', 'UsersController');
    });
});
Run Code Online (Sandbox Code Playgroud)

我的考试

public function testUnauthenticatedUserIndexAccess() {
    $response = $this->call('GET', 'admin/users');

    $this->assertRedirectedTo('admin/login');
}
Run Code Online (Sandbox Code Playgroud)

我的过滤器

Route::filter('auth', function() {
    if (Auth::guest()) return Redirect::guest('admin/login');
});
Run Code Online (Sandbox Code Playgroud)

结果

声明Illuminate\Http\Response Object(...)是类"Illuminate\Http\RedirectResponse"的实例失败.

如果我从测试中记录$ response,它会显示完整的用户列表,就像管理员在测试期间登录一样.

如果我使用浏览器浏览管理员/用户而没有登录我被重定向到像我应该登录,所以auth过滤器确实在工作.

问题

  1. Laravel中是否存在默认情况下在测试期间登录第一个用户的内容?或者Auth :: guest()在测试期间默认为false?
  2. 如果是这样,我如何在单元测试期间"退出"?我试过$ this-> be(null)但是得到一个错误,说传递的对象必须实现UserInterface.

phpunit unit-testing laravel laravel-4

7
推荐指数
1
解决办法
4252
查看次数