支持链式方法的模拟对象
我想知道是否有一种相当简洁的方法来模拟支持方法的对象...因此,数据库查询对象可能具有一个看起来像这样的方法调用: $result = $database->select('my_table')->where(array('my_field'=>'a_value'))->limit(1)->execute(); 如果我必须模拟两个不同的选择查询,以便它们返回不同的结果.有什么想法吗? 这是针对phpunit的,但是其他单元测试框架的经验将有所帮助. 解决方案 我不确定这是您想要的,所以请发表评论: class StubTest extends PHPUnit_Framework_TestCase { public function testChainingStub() { // Creating the stub with the methods to be called $stub = $this->getM
0 2023-05-30
编程技术问答社区
phpunit-模拟S3Client无法正常工作
库:" 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 ... 您可以阅读课程,并通过依赖注入进行单位测试. 专注于构造函数和内部$ this-> s3client-> putobject(...)呼叫uploadfil
0 2023-05-30
编程技术问答社区
如何用PHPUnit重置一个模拟对象
如何重置Phpunit模拟的Expect()? 我有一个模拟肥皂的模拟,我想在测试中多次致电,重置每次运行的期望. $soapClientMock = $this->getMock('SoapClient', array('__soapCall'), array($this->config['wsdl'])); $this->Soap->client = $soapClientMock; // call via query $this->Soap->client->expects($this->once()) ->method('__soapCall') ->with('someString', null, null) ->will($this->returnValue(true)); $result = $this->Soap->query('someString'); $this->assertFalse(!$result, 'Raw qu
0 2023-05-30
编程技术问答社区
在单元测试中嘲弄PHP函数
我正在用简单的方法进行单位测试一些PHP代码,并且遇到了麻烦.在我对数据库类的测试中,我希望能够设置PHPS mysql功能的期望.在我对mail函数的包装类测试中,我想模拟phps mail函数.这些只是一些例子. 重点是:我不(总是)要测试我的邮件类是否发送电子邮件,我想测试它如何调用mail函数.我希望能够控制这些功能返回的内容.我希望能够测试我的数据库类,而无需数据库,固定装置和整个数据库. 我在测试Ruby代码方面有一些经验,并且TEST :: UNIT和RSPEC使得隔离测试代码非常容易.我是对PHP测试的新手,感觉就像我的测试胜于所需的要多得多,以使我的测试通过. 在最简单或phpunit或其他一些测试框架中有办法使它成为可能或更容易? 解决方案 不是以自动化的方式.您可以做的是以某种方式编写代码,以使外部依赖关系包裹在外部传递的对象中.在您的生产环境中,您只需连接真实的适配器,但是在测试过程中,您可以将其连接到存根或模拟. 如果您真的坚持,
0 2023-05-30
编程技术问答社区
phpunit固定类方法被宣布为"最终"
我正在为一种类方法编写单元测试,该方法使用模拟来调用另一类方法的方法,只有需要称为"最终"的方法,因此phpunit无法模拟它.我可以采用其他方法吗? 示例: 要模拟的课 class Class_To_Mock { final public function needsToBeCalled($options) { ... } } 我的测试用例 class MyTest extends PHPUnit_Framework_TestCase { public function testDoSomething() { $mock = $this->getMock('Class_To_Mock', array('needsToBeCalled')); $mock->expects($this->once()) ->method('needsToBeCall
0 2023-05-30
编程技术问答社区
Mockery-call_user_func_array() 希望参数1是一个有效的回调。
我有一个我需要模拟的课: class MessagePublisher { /** * @param \PhpAmqpLib\Message\AMQPMessage $msg * @param string $exchange - if not provided then one passed in constructor is used * @param string $routing_key * @param bool $mandatory * @param bool $immediate * @param null $ticket */ public function publish(AMQPMessage $msg, $exchange = "", $routing_key = "", $mandatory = false, $immediate = false, $ticket = nu
0 2023-05-30
编程技术问答社区
用队列测试听众:: fake()
我的Laravel 5.5应用程序具有Product模型. Product模型具有看起来像这样的属性: /** * The event map for the model. * * @var array */ protected $dispatchesEvents = [ 'created' => ProductCreated::class, 'updated' => ProductUpdated::class, 'deleted' => ProductDeleted::class ]; 我也有一个被称为CreateProductInMagento的听众,该听众映射到EventServiceProvider中的ProductCreated事件.此听众实现ShouldQueue接口. 创建产品时,ProductCreated事件被触发,CreateProductInMagento侦听器被推到队列并运行. 我现在正在尝试为所有这些编写测试
0 2023-05-30
编程技术问答社区
phpunit模拟对象的属性
我正在寻找一种模拟对象并填充其属性的方法. 这是使用另一个对象的属性的方法的示例: class MyClass { private $_object; public function methodUnderTest($object) { $this->_object = $object; return $this->_object->property } } 要进行单位测试此方法,我应该使用getMockBuilder()方法创建一个模拟$object的模拟.但是我找不到一种模拟$object的属性的方法,只有方法. 解决方案 要将属性添加到模拟的对象,您只需像通常使用对象一样设置它们: $mock = $this->getMockBuilder('MyClass') ->disableOriginalConstructor() ->getMock();
0 2023-05-30
编程技术问答社区
在PHPUnit中,我如何模拟父方法?
我想测试一种呼叫具有相同名称的父方法的类方法.有办法这样做吗? class Parent { function foo() { echo 'bar'; } } class Child { function foo() { $foo = parent::foo(); return $foo; } } class ChildTest extend PHPUnit_TestCase { function testFoo() { $mock = $this->getMock('Child', array('foo')); //how do i mock parent methods and simulate responses? } } 解决方案 您不要在测试中的主题(SUT)中模拟或存根方法.如果您觉得自己需要在SUT的父母中模
0 2023-05-30
编程技术问答社区
模拟新类对象调用的方法的单元测试
我正在为现有代码编写单元测试,如 class someClass { public function __construct() { ... } public function someFoo($var) { ... $var = "something"; ... $model = new someClass(); model->someOtherFoo($var); } public someOtherFoo($var){ // some code which has to be mocked } } 在这里我应该如何模拟函数" someOtherFoo"的调用 class someClassTest { public function someFoo() { $fixture = $this->getMock('s
0 2023-05-30
编程技术问答社区
当使用$mock->expects($this->at(...))时,PHPUnit "Mocked method does not exist.
我遇到了Phpunit模拟对象的一个​​奇怪问题.我有一种应称为两次的方法,因此我使用的是" AT"匹配器.这是该方法首次调用的,但是由于某种原因,第二次被称为"不存在模拟方法".我以前曾使用过" AT"匹配项,并且从未遇到过. 我的代码看起来像: class MyTest extends PHPUnit_Framework_TestCase { ... public function testThis() { $mock = $this->getMock('MyClass', array('exists', 'another_method', '...')); $mock->expects($this->at(0)) ->method('exists') ->with($this->equalTo('foo')) ->will($this-
0 2023-05-30
编程技术问答社区
PHPUnit断言没有方法被调用
我有一个使用ServiceB的班级.在某种情况下,Classa最终不应调用任何服务b的方法.我现在想对此进行测试,而Verity确实没有被调用. 这可以如下完成: $classA->expects( $this->never() )->method( 'first_method' ); $classA->expects( $this->never() )->method( 'second_method' ); ... 是否有一种方法可以简单地说明"不应在此对象上调用任何方法",而不得不为每种方法指定限制吗? 解决方案 是的,这很简单,请尝试以下操作: $classA->expects($this->never())->method($this->anything()); 其他解决方案 您可以使用方法MockBuilder::disableAutoReturnValueGeneration. 例如,在您的测试覆盖中默认TestCase::getMo
0 2023-05-30
编程技术问答社区
与phpunit嘲笑PDO
我试图在用phpunit编写一些测试时嘲笑PDO对象,但我发现它很复杂,找不到太多的文档. 我创建了此XML结构: id name description 1 provdier_1 phpunit first provider 现在,我想查询providers表并恢复数据,但我无法弄清楚如何做. 我
0 2023-05-28
编程技术问答社区
使用phpunit模拟抽象类中的具体方法
使用Phpunit在抽象类中模拟混凝土方法有什么好方法? 到目前为止我发现的是: 期望() - > will()使用抽象方法正常工作 它不适用于混凝土方法.原始方法改为运行. 使用无用的builder并将所有抽象方法和混凝土方法提供给setMethods()的作品.但是,它要求您指定所有抽象方法,使测试变得脆弱且冗长. sockbuilder :: getMockforabStractClass()忽略setMethod(). 这是一些单位测试检查以上几点: abstract class AbstractClass { public function concreteMethod() { return $this->abstractMethod(); } public abstract function abstractMethod(); } class AbstractClassTest extends PHP
2 2023-05-28
编程技术问答社区
PHPUnit:存根方法未定义
我必须缺少一些东西.我正在尝试在phpunit中的类上固执,但是当我在模拟对象上调用该方法时,它告诉我方法不确定. 示例类别为存根: namespace MyApp; class MyStubClass { public function mrMethod() { // doing stuff } } 对它存根,我写了: // specifying all getMock() args to disable calling of class __construct() $stub = $this->getMock('MyStubClass', array(), array(), 'MockMyStubClass', false, false, false); $stub->expects($this->any()) ->method('mrMethod') ->will($this->returnValue(
0 2023-05-28
编程技术问答社区
在Laravel中运行特性测试时,如何模拟服务(或服务提供商)?
我正在撰写Laravel的小型API,部分是为了学习此框架.我想我已经在文档中发现了一个漏洞,但这可能是由于我不了解做我想做的" laravel方法". 我正在编写HTTP API,除其他外,列表,创建和删除Linux服务器上的系统用户.结构就像: 路由到/v1/users连接GET,POST和DELETE动词到控制器方法get,create和create和delete. 控制器App\Http\Controllers\UserController实际上没有运行系统调用,这是由服务完成的App\Services\Users. 该服务是由ServiceProvider创建的App\Providers\Server\Users,该服务以延期为基础注册服务的A singleton. 该服务是由Laravel自动实例化并自动注入控制器的构造函数的. 好的,这一切都可以.我还编写了一些测试代码,例如: public function testGetUsers() {
0 2023-05-28
编程技术问答社区
PHPUnit-创建Mock对象来作为属性的存根
我正在尝试在phpunit中配置模拟对象,以返回不同属性的值(使用__get函数访问这些属性) 示例: class OriginalObject { public function __get($name){ switch($name) case "ParameterA": return "ValueA"; case "ParameterB": return "ValueB"; } } 我试图使用以下方式模拟此问题: $mockObject = $this->getMock("OrigionalObject"); $mockObject ->expects($this->once()) ->method('__get') ->with($this->equalTo('ParameterA')) ->will($this->returnValue("ValueA")); $mockObject ->expects
0 2023-05-28
编程技术问答社区
为多个调用指定预期参数的Mockery
我正在尝试模拟一个对象,该对象将两个调用到同一函数但有不同的参数.回馈多个呼叫的不同返回值是非常直接的,但是我找不到任何地方如何处理参数验证. . 我尝试了: $this->eventDispatcher ->shouldReceive('dispatch') ->twice() ->with(Events::SELECT,\Mockery::type('\Not\Really\A\Namespace\Event')) ->with(Events::ACTIVITY,\Mockery::type('\Not\Really\A\Namespace\Event'); 和 $this->eventDispatcher ->shouldReceive('dispatch') ->twice() ->with( [Events::SELECT,\Mockery::type
0 2023-05-28
编程技术问答社区
在PhpUnit中,是否可以在测试用例之外创建一个模拟对象?
这似乎很愚蠢,希望不要,但是我想创建一项服务,该服务将为使用我的项目的人们返回模拟对象,以便他们可以模拟我的项目中的所有类并测试其代码. 我的想法是提供此类服务,以便可以在其他项目的测试用例中调用并为每个测试获得适当的模拟. 可能吗?否则还有其他方法可以做到这一点.顺便说一句,由于项目的限制,我无法使用任何模拟库. 解决方案 是的,这是可能的.在引擎盖下,getMock方法使用PHPUnit_Framework_MockObject_Generator类.因此,您可以直接使用它: PHPUnit_Framework_MockObject_Generator::getMock($originalClassName, $methods) 但是您将失去所有期望快捷方式,例如$this->once().您将必须自己实例化期望: $mock->expects(\PHPUnit_Framework_TestCase::once()) 查看其他解决方案 如果
0 2023-05-27
编程技术问答社区
PhpUnit模拟一个内置的函数
有没有一种方法可以模拟/覆盖PHPUnit中的内置函数shell_exec.我知道Mockery,除了PHPUnit>. 之外,我无法使用其他库. 我尝试了3个多小时,并且在某个地方被卡住了.任何指针/链接都将不胜感激. 我正在使用Zend-Framework 2. 解决方案 有几个选项.您可以在测试范围的命名空间中重新列出php函数shell_exec 检查参考这个很棒的博客文章: php:"模拟"内置函数,例如单位测试中的time() ..
0 2023-05-27
编程技术问答社区