我想模拟一个类的方法并执行一个回调,它修改作为参数给出的对象(使用PHP 5.3和PHPUnit 3.5.5).
假设我有以下课程:
class A
{
function foobar($object)
{
doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这个设置代码:
$mock = $this->getMockBuilder('A')->getMock();
$mock->expects($this->any())->method('foobar')->will(
$this->returnCallback(function($object) {
$object->property = something;
}));
Run Code Online (Sandbox Code Playgroud)
由于某种原因,对象不会被修改.在var_dump荷兰国际集团$object我认为它是正确的对象.是否可以通过值传递对象?如何配置模拟以接收引用?
所以我早上/周末的表现非常令人失望.它以设置PHPUnit,集成Eclipse等形式出现
现在我刚刚发现没有直接从PHPUnit测试CodeIgniter 2.0应用程序的方法.
我花了很多时间研究库(FooStack和CIUnit)但这些库的开发已经停止并且与CI 2.0不兼容
在我参加包含2.0单元测试课程之前,我需要问一下,我是否错过了有关CI 2.0和PHPUnit的任何重大进展.
任何指导都非常感谢.
谢谢,康纳
我想轻松地使用php单元从我的多个测试用例类中执行一些选定的测试用例.
由于我的1-2个测试用例在一堆测试用例中失败,并且发现这两个测试用例再次难以执行整个测试套件,是否有任何方法无需向其他人添加注释或在不同的套件中复制这两种方法.
感谢所有提前
我希望能够在DateTimePHPUnit或Behat Test的持续时间内为每个实例化实例设置时间.
我正在测试与时间相关的业务逻辑.例如,类中的方法仅返回过去或将来的事件.
如果可能的话,我不想这样做:
写一个包装器DateTime并使用它代替DateTime整个代码.这将涉及重写我当前的代码库.
每次运行测试/套件时动态生成数据集.
所以问题是:是否有可能覆盖DateTimes行为以始终在请求时提供特定时间?
我正在尝试使用PHPUnit为php应用程序实现类似Django的测试实用程序.就像Django一样,我的意思是在运行第一个测试之前从主数据库创建一个单独的测试数据库,并在运行最后一个测试后删除它.即使一次运行多个测试用例,也只需创建一次测试数据库.
为此,我采取了以下方法 -
我定义了一个自定义测试套件类,以便我可以在其设置和拆卸方法中编写用于创建和删除db的代码,然后使用此类运行测试,如下所示
$ phpunit MyTestSuite
Run Code Online (Sandbox Code Playgroud)
MyTestSuite定义了一个名为的静态方法suite,我只是使用glob它并将测试添加到testsuite,如下所示
public static function suite() {
$suite = new MyTestSuite();
foreach (glob('./tests/*Test.php') as $tc) {
require_once $tc;
$suite->addTestSuite(basename($tc, '.php'));
}
return $suite;
}
Run Code Online (Sandbox Code Playgroud)
所有测试用例类都从子类延伸,PHPUnit_Framework_TestCase并且此类的setup和teardown方法负责从json fixture文件加载和清除初始数据.
现在作为没有.测试正在增加,我需要一次只运行一个选定的测试.但由于我已经使用测试套件加载测试,因此无法使用--filter选项.这让我觉得这种方法可能不正确.
所以我的问题是,在运行第一个测试之前和运行最后一个测试之后做什么的正确方法是什么,而不管PHPUnit如何找到它们?
PS:我没有使用PHPUnit_Extensions_Database_TestCase,而是我自己创建,填充和删除数据库的实现.
我有一个控制器,在提交电子邮件后,执行重定向到家庭,如下所示:
return Redirect::route('home')->with("message", "Ok!");
Run Code Online (Sandbox Code Playgroud)
我正在为它编写测试,我不知道如何使phpunit遵循重定向,测试成功消息:
public function testMessageSucceeds() {
$crawler = $this->client->request('POST', '/contact', ['email' => 'test@test.com', 'message' => "lorem ipsum"]);
$this->assertResponseStatus(302);
$this->assertRedirectedToRoute('home');
$message = $crawler->filter('.success-message');
// Here it fails
$this->assertCount(1, $message);
}
Run Code Online (Sandbox Code Playgroud)
如果我替换控制器上的代码,我删除前两个断言,它的工作原理
Session::flash('message', 'Ok!');
return $this->makeView('staticPages.home');
Run Code Online (Sandbox Code Playgroud)
但我想用Redirect::route.有没有办法让PHPUnit遵循重定向?
class Testme()
{
public function testMe ($a)
{
if ($a == 1)
{
throw new Exception ('YAY');
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以它很容易测试,如果它抛出异常
/**
* @expectedException Exception
*/
public function test()
{
new Testme(1);
}
Run Code Online (Sandbox Code Playgroud)
但如果它什么都没做呢?
public function test()
{
new Testme(2);
?? ? ? ? ?
}
Run Code Online (Sandbox Code Playgroud) 我不想写长篇文章,因为这是一个简短的问题.PHPUnit测试包含几个静态的方法.例如所有那些\PHPUnit\Framework\Assert::assert*()方法以及identicalTo,equalTo.
我的IDE(具有IntelliSense /自动完成功能)不接受使用$this,但使用self.我已经知道应该通过类调用静态函数,而不是对象self.
什么更正确?
$this->assertTrue('test');
Run Code Online (Sandbox Code Playgroud)
要么
self::assertTrue('test');
Run Code Online (Sandbox Code Playgroud)
?
(如果"$ this"更正确,你能否指出为什么我们不应该使用"自我"?)
为了爱我的生活,我无法弄清楚createMock($type)和之间的区别getMockBuilder($type)
我正在阅读原始文档,并且只有一个我不理解的衬垫.
...您可以使用getMockBuilder($ type)方法使用流畅的界面自定义测试双生成.
如果你能给我一个例子,我将不胜感激.谢谢.
我有一个有趣的场景,我需要定义一个函数,以便为另一个函数进行测试.我想测试的功能看起来像这样:
if (function_exists('foo') && ! function_exists('baz')) {
/**
* Baz function
*
* @param integer $n
* @return integer
*/
function baz($n)
{
return foo() + $n;
}
}
Run Code Online (Sandbox Code Playgroud)
我检查是否存在的foo原因是因为它可能在开发人员的项目中定义,也可能没有定义,并且该函数baz依赖于该函数foo.因此,我只想baz定义它是否可以调用foo.
唯一的问题是到目前为止,无法编写测试.我尝试在PHPUnit配置中创建一个引导脚本,该脚本将定义一个假foo函数,然后需要Composer自动加载器,但我的主脚本仍然认为foo没有定义.foo不是Composer包,我的项目不能要求.显然,Mockery也不适用于此.我的问题是,如果有更多有经验的PHPUnit遇到过这个问题并找到了解决方案.
谢谢!