- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
-6ren">
库:“aws/aws-sdk-php”:“2.*”
PHP版本:PHP 5.4.24 (cli)
Composer .json
{
"require": {
"php": ">=5.3.1",
"aws/aws-sdk-php": "2.*",
...
},
"require-dev": {
"phpunit/phpunit": "4.1",
"davedevelopment/phpmig": "*",
"anahkiasen/rocketeer": "*"
},
...
}
我们制作了一个 AwsWrapper 来获取功能操作:uploadFile、deleteFile...
您可以阅读该类,使用依赖注入(inject)进行单元测试。
关注构造函数和内部 $this->s3Client->putObject(...) 对 uploadFile 函数的调用。
<?php
namespace app\lib\modules\files;
use Aws\Common\Aws;
use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;
use core\lib\exceptions\WSException;
use core\lib\Injector;
use core\lib\utils\System;
class AwsWrapper
{
/**
* @var \core\lib\Injector
*/
private $injector;
/**
* @var S3Client
*/
private $s3Client;
/**
* @var string
*/
private $bucket;
function __construct(Injector $injector = null, S3Client $s3 = null)
{
if( $s3 == null )
{
$aws = Aws::factory(dirname(__FILE__) . '/../../../../config/aws-config.php');
$s3 = $aws->get('s3');
}
if($injector == null)
{
$injector = new Injector();
}
$this->s3Client = $s3;
$this->bucket = \core\providers\Aws::getInstance()->getBucket();
$this->injector = $injector;
}
/**
* @param $key
* @param $filePath
*
* @return \Guzzle\Service\Resource\Model
* @throws \core\lib\exceptions\WSException
*/
public function uploadFile($key, $filePath)
{
/** @var System $system */
$system = $this->injector->get('core\lib\utils\System');
$body = $system->fOpen($filePath, 'r');
try {
$result = $this->s3Client->putObject(array(
'Bucket' => $this->bucket,
'Key' => $key,
'Body' => $body,
'ACL' => 'public-read',
));
}
catch (S3Exception $e)
{
throw new WSException($e->getMessage(), 201, $e);
}
return $result;
}
}
测试文件将我们的 Injector 和 S3Client 实例作为 PhpUnit MockObject。要模拟 S3Client,我们必须使用 Mock Builder 禁用原始构造函数。
模拟 S3Client:
$this->s3Client = $this->getMockBuilder('Aws\S3\S3Client')->disableOriginalConstructor()->getMock();
要配置内部 putObject 调用(用 putObject 抛出 S3Exception 进行测试的情况,但我们对 $this->returnValue($expected) 有同样的问题。
初始化测试类并配置sut:
public function setUp()
{
$this->s3Client = $this->getMockBuilder('Aws\S3\S3Client')->disableOriginalConstructor()->getMock();
$this->injector = $this->getMock('core\lib\Injector');
}
public function configureSut()
{
return new AwsWrapper($this->injector, $this->s3Client);
}
无效代码:
$expectedArray = array(
'Bucket' => Aws::getInstance()->getBucket(),
'Key' => $key,
'Body' => $body,
'ACL' => 'public-read',
);
$this->s3Client->expects($timesPutObject)
->method('putObject')
->with($expectedArray)
->will($this->throwException(new S3Exception($exceptionMessage, $exceptionCode)));
$this->configureSut()->uploadFile($key, $filePath);
当我们执行我们的测试函数时,注入(inject)的S3Client没有抛出异常也没有返回预期的值,总是返回NULL。
通过 xdebug,我们已经看到 S3Client MockObject 配置正确,但不能像 will() 配置的那样工作。
一个“解决方案”(或一个糟糕的解决方案)可能是做一个 S3ClientWrapper,这只会将问题转移到其他不能用 mock 进行单元测试的类。
有什么想法吗?
更新使用 xdebug 配置 MockObject 的屏幕截图:
最佳答案
以下代码按预期运行和通过,因此我认为您不会遇到由 PHPUnit 或 AWS SDK 引起的任何限制。
<?php
namespace Aws\Tests;
use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;
use Guzzle\Service\Resource\Model;
class MyTest extends \PHPUnit_Framework_TestCase
{
public function testMockCanReturnResult()
{
$model = new Model([
'Contents' => [
['Key' => 'Obj1'],
['Key' => 'Obj2'],
['Key' => 'Obj3'],
],
]);
$client = $this->getMockBuilder('Aws\S3\S3Client')
->disableOriginalConstructor()
->setMethods(['listObjects'])
->getMock();
$client->expects($this->once())
->method('listObjects')
->with(['Bucket' => 'foobar'])
->will($this->returnValue($model));
/** @var S3Client $client */
$result = $client->listObjects(['Bucket' => 'foobar']);
$this->assertEquals(
['Obj1', 'Obj2', 'Obj3'],
$result->getPath('Contents/*/Key')
);
}
public function testMockCanThrowException()
{
$client = $this->getMockBuilder('Aws\S3\S3Client')
->disableOriginalConstructor()
->setMethods(['getObject'])
->getMock();
$client->expects($this->once())
->method('getObject')
->with(['Bucket' => 'foobar'])
->will($this->throwException(new S3Exception('VALIDATION ERROR')));
/** @var S3Client $client */
$this->setExpectedException('Aws\S3\Exception\S3Exception');
$client->getObject(['Bucket' => 'foobar']);
}
}
您还可以使用 Guzzle MockPlugin如果您只想模拟响应而不关心模拟/ stub 对象。
关于PHPUnit - 模拟 S3Client 运行不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24080306/
我可以在所有 PHPUnit 测试完成后自动运行 PHP 脚本吗? 我想在所有测试完成后报告一些非致命问题(即正确但次优的测试结果)。 最佳答案 假设您可以检测到此类次优结果,PHPUnit(v9 及
假设我要测试三种状态下的数据库一致性: 插入数据后 - 我想确保已将一定数量的行插入到数据库表中。 当数据更新后-我想重复行数量测试(数量必须与插入后相同) 删除数据时 - 我想确保所有数据都已删除。
在 pear.phpunit.de/PHPUnit 中安装 PHPUnit 未知 channel pear.phpunit.de 时出错 无效的包名称/包文件 "Debian-4 操作系统上的 pea
谁能给我解释一下使用名为 phpunit.xml.dist 或 phpunit.xml 的 PHPunit 配置文件有什么区别。 official documentation提到两个名字: PHPUn
如果我只想使用来自数据提供者的一个数据运行测试,我该怎么做? 我在这个线程上尝试了解决方案,但没有奏效 Cannot run single test with data provider in PHP
如何编写自定义断言,例如 assertFoo($expected, $actual) ,它的行为类似于关于错误“堆栈跟踪”的内置断言? 我目前定义了以下方法(在扩展 PHPUnit_Framework
我想在我的 Windows 服务器上安装 PHPUnit 3.7。我遵循了各种说明 here并以 PHPUnit 3.4.1 结束。当我尝试使用以下方法再次安装它时: pear update chan
我尝试在 PhpUnit 的 WebTestCase 中发送原始数据,但它不起作用: $jsonEvent = '{ "type": "invoice.payment_succeeded"
我收到了 PHPUnit 错误的代码覆盖率报告,我相信这是 XDebug 的一个错误。 如何配置 PHPUnit 以使用 one of its other drivers ,即PHPDBG? (我使用
我正在我的第一个项目中使用 PHPUnit 进行单元测试。事情进展顺利;但是,我已经开始通过最近的测试获得以下输出: .........................................
我刚刚学习如何使用 PHPUnit。我从命令行运行它,在结果中我得到OK,但是有问题!测试:5,断言:15,警告:2,弃用:5。 我不知道如何让它解释导致弃用和警告计数的原因。 如何找出测试代码中导致
是否有比 $this->assertTrue(false) 更官方的方法来强制 phpunit 失败? 最佳答案 我相信这应该在测试用例中起作用: $this->fail('Message'); 关于
我正在尝试为我的 Silex 应用程序编写一些测试,但遇到了问题。 我有以下 phpunit.xml 文件 ./
目前,我正在尝试使用命令行 phpunittests/Unit/ExampleTest 在 Laravel 项目上使用 phpunit 运行一些简单的单元测试。但它只运行第一种方法。有人有解决办法吗?
我的一些测试用例使用自定义测试库。而且这些测试用例非常慢。所以我想只在构建服务器中运行它们,而不是在我的本地服务器中运行它们。我想在本地运行其他测试。 以下是目录结构。 slow 目录中的那些是应该排
我有以下测试/文件夹: tests/ ClassOne.test.php ClassTwo.test.php ClassThree.test.php 我必须将以下 setUp() 和
我使用 phpunit 的测试套件功能来组织我的测试。我这样做是为了以后能够并行运行测试。 对于不同的目录,这是相对直接的。例如,我可以按捆绑拆分测试套件。 tests/BundleOne
我必须用内部数组测试一个数组。 我的数组如下所示。 $testdata=Array ( [0] => Array ( [
问题:为什么 PHPUnit 似乎在严格模式下运行? 问题: PHPUnit 4.3.1 by Sebastian Bergmann. Configuration read from /full/pa
我已经通过 Composer 安装了 PHPUnit,并将其设置为通过设置运行单元测试。 但是当我运行测试时,测试报告器出现以下错误(tets 执行得很好): Unable to attach tes
我是一名优秀的程序员,十分优秀!