标签: phpunit

如何在进行单元测试时覆盖php://输入

我正在尝试使用Zend和PHPUnit为控制器编写单元测试

在代码中我从php:// input获取数据

$req = new Zend_Controller_Request_Http();
$data = $req->getRawBody();
Run Code Online (Sandbox Code Playgroud)

当我测试真实的应用程序时,我的代码工作正常,但除非我可以提供数据作为原始http帖子,否则$ data将始终为空.getRawBody()方法基本上调用file_get_contents('php:// input'),但是如何覆盖它以便将测试数据提供给我的应用程序.

php phpunit unit-testing zend-framework

19
推荐指数
3
解决办法
3818
查看次数

如何在PHPUnit中捕获PHP警告

我正在编写测试用例,这是我的一个问题.

所以说我正在测试一个简单的函数 someClass::loadValue($value)

正常的测试用例很简单,但假设在传入null或-1时,函数调用会生成一个PHP警告,这被认为是一个错误.

问题是,如何编写我的PHPUnit测试用例,以便在函数正常处理null/-1时成功,并在抛出PHP警告时失败?

谢谢,

phpunit

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

PHPUnit测试真实的例子

我已经创建了一个邮件包装器类.我知道有很多库可以发送电子邮件,但我想学习TDD ...所以,我已经创建了一些测试,我有一些代码.现在我可以在构造函数上设置电子邮件地址并验证它......如果电子邮件地址错误,则会引发异常.电子邮件地址是唯一一个必填字段...我没有设置和获取因为用户将在构造函数上设置所有电子邮件数据.

现在,我要编写发送测试.我不知道如何开始它.如果我不想有定位器和吸气剂,我怎么能测试值是否存在(主题,邮件正文,标题)?如何测试是否可以发送电子邮件?

现实世界的TDD示例对我来说很难.我试图了解它,我已经阅读了很多东西,但我无法测试真正的代码.

谢谢.

php email tdd phpunit wrapper

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

忽略PHPUnit中的PHP警告

我使用PHPUnit对我的函数进行单元测试,当代码中出现任何警告时,不会对该函数执行测试脚本,任何人都可以告诉我如何忽略警告并继续测试

php phpunit unit-testing

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

如何使用PEAR安装程序完全删除PHPUnit?

我几天前使用PEAR安装程序安装了PHPUnit(我还安装了Selenium RC以便在PHP中进行测试).现在我要卸载它(也删除所有相关的文件夹和文件)

我运行了以下命令:

pear uninstall phpunit/PHPUnit
Run Code Online (Sandbox Code Playgroud)

和控制台显示:

phpunit/PHPUnit not installed
Run Code Online (Sandbox Code Playgroud)

我检查了PHPUnit文件夹,它还在那里?

它被卸载了吗?我尝试重新安装一个新的PHPUnit,但控制台显示:

No releases available for package "pear.phpunit.de/PHPUnit"
Run Code Online (Sandbox Code Playgroud)

我该如何重新安装?


这是输出pear list -c pear.phpunit.de:

梨列表-c pear.phpunit.de

这是输出pear list -c pear.phpunit.de:

梨列表-c pear.phpunit.de

php windows selenium pear phpunit

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

在PHPUnit中实现给定接口的模拟对象上的未定义方法?

我是单元测试和PHPUnit的新手.

我需要一个模拟,我有一个完全控制,实现ConfigurationInterface接口.测试主题是ReportEventParamConverter对象,测试必须检查我的对象和界面之间的交互.

ReportEventParamConverter 对象(这里简化):

class ReportEventParamConverter implements ParamConverterInterface
{
    /**
     * @param Request $request
     * @param ConfigurationInterface $configuration
     */
    function apply(Request $request, ConfigurationInterface $configuration)
    {
        $request->attributes->set($configuration->getName(), $reportEvent);
    }

    /**
     * @param ConfigurationInterface $configuration
     * @return bool
     */
    function supports(ConfigurationInterface $configuration)
    {
        return 'My\Namespaced\Class' === $configuration->getClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我试图模仿界面的方式:

$cls = 'Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface';
$mock = $this->getMock($mockCls);
Run Code Online (Sandbox Code Playgroud)

我需要模拟两种方法的返回值:getClass()getName().例如:

$mock->expects($this->any())
    ->method('getClass')
    ->will($this->returnValue('Some\Other\Class'))
;
Run Code Online (Sandbox Code Playgroud)

当我创建一个新的ReportEventParamConverter测试supports()方法时,我得到以下PHPUnit错误:

致命错误:调用未定义的方法Mock_ConfigurationInterface_21e9dccf :: getClass().

$converter = new ReportEventParamConverter();
$this->assertFalse($converter->supports($mock));
Run Code Online (Sandbox Code Playgroud)

php phpunit unit-testing mocking symfony

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

19
推荐指数
3
解决办法
5264
查看次数

如何为Slim Framework中构建的REST API编写单元测试?

我有一个内置Slim的API,如下所示:

    $app->group('/'.$endpoint, function () use ($app, $endpoint) {

        $handler = Api\Rest\Handlers\Factory::load($endpoint);

        if (is_null($handler)) {
            throw new \Exception('No REST handler found for '.$endpoint);
        }

        $app->get('(/:id)', function ($id) use ($app, $handler) {
            echo json_encode($handler->get($id));
        });

        $app->post('', function () use ($app, $handler) {
            echo json_encode($handler->post($app->request->post()));
        });

        $app->put(':id', function ($id) use ($app, $handler) {
            echo json_encode($handler->put($id, $app->request->put()));
        });

        $app->delete(':id', function ($id) use ($app, $handler) {
            echo json_encode($handler->delete($id));
        });

    });
Run Code Online (Sandbox Code Playgroud)

$endpoint 是一个字符串,例如'user';

我该如何为它编写单元测试?

理想的情况下;

class RestUserTest extends PHPUnitFrameworkTestCase 
{
    public function testGet() 
    {
        $slim = …
Run Code Online (Sandbox Code Playgroud)

rest phpunit slim

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

如何使用laravel和phpunit测试文件上传?

我正在尝试在我的laravel控制器上运行此功能测试.我想测试图像处理,但这样做我想伪造图像上传.我该怎么做呢?我在网上找到了一些例子,但似乎没有一个适合我.这就是我所拥有的:

public function testResizeMethod()
{
    $this->prepareCleanDB();

    $this->_createAccessableCompany();

    $local_file = __DIR__ . '/test-files/large-avatar.jpg';

    $uploadedFile = new Symfony\Component\HttpFoundation\File\UploadedFile(
        $local_file,
        'large-avatar.jpg',
        'image/jpeg',
        null,
        null,
        true
    );


    $values =  array(
        'company_id' => $this->company->id
    );

    $response = $this->action(
        'POST',
        'FileStorageController@store',
        $values,
        ['file' => $uploadedFile]
    );

    $readable_response = $this->getReadableResponseObject($response);
}
Run Code Online (Sandbox Code Playgroud)

但是控制器没有通过这个检查:

elseif (!Input::hasFile('file'))
{
    return Response::error('No file uploaded');
}
Run Code Online (Sandbox Code Playgroud)

所以文件不能正确传递.我该怎么做?


更新

基于max.lanin的建议,我也尝试过:

public function testResizeMethod()
{
    $this->prepareCleanDB();

    $this->_createAccessableCompany();

    $local_file = __DIR__ . '/test-files/large-avatar.jpg';

    $uploadedFile = new Symfony\Component\HttpFoundation\File\UploadedFile(
        $local_file,
        'large-avatar.jpg',
        'image/jpeg',
        null,
        null,
        true
    );


    $values = …
Run Code Online (Sandbox Code Playgroud)

php phpunit laravel

19
推荐指数
4
解决办法
2万
查看次数

如何使用PHPUnit对并发读/写单元进行单元测试?

我最近在实时应用程序上遇到了一个问题.我意识到我有越来越多的并发异常和数据库锁.

基本上我启动一个事务,它需要一个SELECT和一个INSERT在同一个表上提交.

但是因为负载非常繁重,所以每个事务都会锁定表,在大多数情况下,它会如此之快,不会导致任何问题,但锁存器开始等待的时间越来越多.

我通过调整查询来解决这个问题.

虽然,现在,我想用PHPUnit编写一些测试来验证我的修复并避免任何回归.

我无法找到任何关于如何做到这一点的材料.

由于PHP不是多线程的,我不知道如何在单个测试中运行并发查询来验证.

基本上,我希望能够在一次测试中运行多个调用,以确保一切正常.

我知道我可以通过直接查询http服务器并加载整个应用程序来尝试进行一些高级测试,但由于我的问题来自一个独立的库,我宁愿自己测试它.

有任何想法吗?

php concurrency phpunit database-deadlocks

19
推荐指数
1
解决办法
1380
查看次数