基本上我有一个名为killProgram的类的方法,它用于发送hTTP重定向然后杀死PHP.
我该怎么测试呢?当我运行phpunit时,它不返回该测试的任何内容,并完全关闭.
现在我正在考虑让killProgram函数抛出一个不应该被处理的异常,这将允许我断言抛出异常.
有没有更好的办法?
鉴于以下课程:
<?php
class Example {
private $Other;
public function __construct ($Other)
{
$this->Other = $Other;
}
public function query ()
{
$params = array(
'key1' => 'Value 1'
, 'key2' => 'Value 2'
);
$this->Other->post($params);
}
}
Run Code Online (Sandbox Code Playgroud)
而这个测试用例:
<?php
require_once 'Example.php';
require_once 'PHPUnit/Framework.php';
class ExampleTest extends PHPUnit_Framework_TestCase {
public function test_query_key1_value ()
{
$Mock = $this->getMock('Other', array('post'));
$Mock->expects($this->once())
->method('post')
->with(YOUR_IDEA_HERE);
$Example = new Example($Mock);
$Example->query();
}
Run Code Online (Sandbox Code Playgroud)
如何验证$params(哪个是数组)并传递给$Other->post()包含名为'key1'且值为'Value 1'的键?
我不想验证所有的数组 - 这只是一个示例代码,在实际代码中传递的数组有更多的值,我想在那里只验证一个键/值对.
还有$this->arrayHasKey('keyname'),我可以用它来验证该键存在.
还有$this->contains('Value …
我一直在为一个项目创建一个测试套件,虽然我意识到100%的覆盖率并不是人们应该努力的指标,但在代码覆盖率报告中有一点奇怪,我想要一些澄清.
看截图:

因为正在测试的方法的最后一行是a return,所以最后一行(它只是一个结束括号)显示为从未执行,因此整个方法被标记为未在概述中执行.(要不然,或者我没有正确阅读报告.)
完整的方法:
static public function &getDomain($domain = null) {
$domain = $domain ?: self::domain();
if (! array_key_exists($domain, self::$domains)) {
self::$domains[$domain] = new Config();
}
return self::$domains[$domain];
}
Run Code Online (Sandbox Code Playgroud)
有这个原因,还是一个小故障?
(是的,我通读了如何使用PHPUnit获得100%的代码覆盖率,不同的情况虽然相似.)
编辑:
通过报告跋涉,我注意到switch代码中其他地方的陈述也是如此.所以这种行为至少在某种程度上是一致的,但对我来说却令人困惑.
EDIT2:
我正在运行:OS X上的PHPUnit 3.6.7,PHP 5.4.0RC5,XDebug 2.2.0-dev
我想看看在phpunit运行期间当前执行了哪个测试.
我使用--debug参数但仍然只得到点:
$ phpunit --debug PHPUnit 3.7.19 by Sebastian Bergmann. Configuration read from /home/foo/bar/phpunit.xml ..S.......I..
内容phpunit.xml:
<phpunit backupGlobals="true"
bootstrap="tests/bootstrap.php"
backupStaticAttributes="false"
cacheTokens="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
forceCoversAnnotation="false"
mapTestClassNameToCoveredClassName="false"
printerClass="PHPUnit_TextUI_ResultPrinter"
processIsolation="false"
stopOnError="false"
stopOnFailure="false"
stopOnIncomplete="false"
stopOnSkipped="false"
testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
strict="false"
verbose="true">
<testsuites>
<testsuite name="foo Tests">
<directory>./tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist addUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./src</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-clover" target="./clover.xml"/>
</logging>
</phpunit>
Run Code Online (Sandbox Code Playgroud)
这可能是什么原因?
假设我有一个类包含一个使用类型提示的函数,如下所示:
class Testable
{
function foo (Dependency $dependency)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我想Testable使用以下代码对此类进行单元测试:
$dependencyMock = $this->getMockBuilder('Dependency')
->disableOriginalConstructor()
->getMock();
$testable = new Testable($dependencyMock);
Run Code Online (Sandbox Code Playgroud)
如果我使用PHPUnit创建$ dependency的存根,然后尝试foo使用这个模拟调用函数(如上所述),我将得到一个致命的错误,说:
传递给函数foo()的参数1必须是Dependency的一个实例,给出Mock_Foo的实例
如何使用PHPUnit和仍然存根来对此函数进行单元测试$dependency?
我看到了将PHPUnit单元测试组织到命名空间层次结构中的两种选择.这两种方法有哪些优点/缺点?是否有任何明显的缺陷我没有考虑过会使一个明显更好的选择?
考虑一个示例类,如\SomeFramework\Utilities\AwesomeClass:
方法1:将每个TestCase类放入与覆盖类相同的名称空间中.
\SomeFramework\Utilities\AwesomeClassTest
Run Code Online (Sandbox Code Playgroud)
方法2:将每个TestCase放在以覆盖类命名的命名空间中.
\SomeFramework\Utilities\AwesomeClass\Test
Run Code Online (Sandbox Code Playgroud)
我在使用PHPUnit模拟PDO对象时遇到困难.
网上似乎没有太多关于我的问题的信息,但是我可以收集的信息:
通过在单元测试中添加以下行,有一个旨在防止此行为的功能:
class MyTest extends PHPUnit_Framework_TestCase
{
protected $backupGlobals = FALSE;
// ...
}
Run Code Online (Sandbox Code Playgroud)
资料来源:http://sebastian-bergmann.de/archives/797-Global-Variables-and-PHPUnit.html
这不适合我,我的测试仍然会产生错误.
完整的测试代码:
class MyTest extends PHPUnit_Framework_TestCase
{
/**
* @var MyTest
*/
private $MyTestr;
protected $backupGlobals = FALSE;
/**
* Prepares the environment before running a test.
*/
protected function setUp()
{
parent::setUp();
}
/**
* Cleans up the environment after running a test.
*/
protected function tearDown()
{
parent::tearDown();
}
public function __construct()
{
$this->backupGlobals = …Run Code Online (Sandbox Code Playgroud) 获取消息:
好的,但不完整或跳过测试!
没有任何信息发生的地方.只有:..我........
我怎样才能找到问题所在?
谢谢
是否有任何PHPUnit与Eclipse PDT的集成?
如果没有,有没有计划这样做?
我想配置我的PhpStorm IDE以在我的Docker容器中运行PHPUnit测试.
似乎我只能使用本地PHP可执行文件,或者通过SSH作为测试的解释器.
我可以在我的PHP容器上安装SSH服务,但它似乎是一个hacky解决方案,并且在线文章不鼓励在容器上安装SSH服务.
为了尝试让本地解释器工作,我尝试创建一个bash脚本来代理容器内对PHP的调用,如下所示:
#!/usr/bin/env bash
# Run PHP through Docker
docker exec -t mycontainer_php_1 php "$@"
Run Code Online (Sandbox Code Playgroud)
当我自己运行它时,这非常有效,但当我将PhpStorm指向它作为本地PHP解释器时,它不会将其识别为有效的PHP可执行文件.
那么什么是让这个工作的好方法?
phpunit ×10
php ×8
unit-testing ×4
symfony ×2
docker ×1
eclipse ×1
eclipse-pdt ×1
mocking ×1
pdo ×1
phpstorm ×1
testing ×1
type-hinting ×1