我编写了一个API,它从另一个API获取数据并将其转换为XML.如何使用phpunit测试输出是否为预期的XML并且有效?
我应该创建一个包含所有节点的样本xml,然后检查输出吗?
我的测试课中有一个测试用例,并且有一些问题.我从控制台运行脚本.该脚本执行到某一点,然后测试失败,出现错误:
Could not connect to the Selenium RC server.
这是来自控制台的日志:
PHPUnit 3.5.15 by Sebastian Bergmann. E Time: 01:56, Memory: 4.00Mb There was 1 error: 1) someTest::testSomething PHPUnit_Framework_Exception: Could not connect to the Selenium RC server. /var/www/path.../someTest.php:105 FAILURES! Tests: 1, Assertions: 0, Errors: 1.
我的测试脚本中的第105行:
$this->clickAndWait("//a[text()='Next']");
这是Selenium日志:
14:00:40.983 INFO - Command request: click[//a[text()='Next'], ] on session 4222e17607254f41a6a52e13d0fd7cc5 14:00:41.205 INFO - Got result: OK on session 4222e17607254f41a6a52e13d0fd7cc5 14:00:41.207 INFO - Command request: waitForPageToLoad[600000000, ] on session 4222e17607254f41a6a52e13d0fd7cc5 14:02:11.328 INFO …
有没有办法用phpunit创建一个模拟类,而不是模拟对象?我正在寻找一种方法来进行依赖注入,而不必显式传递一个类可能需要在构造函数(或任何地方)中使用的每个对象.对于所有这些情况,将返回"true"的东西:
public function testAAAA()
{
$foo = $this->getMock('foo', array('bar'));
var_dump(class_exists('foo', false));
var_dump(method_exists('foo', 'bar'));
var_dump(method_exists($foo, 'bar'));
}
Run Code Online (Sandbox Code Playgroud)
这打印:
bool(true)
bool(false)
bool(true)
Run Code Online (Sandbox Code Playgroud)
表明虽然它成功创建了一个虚假的'foo'类,但它并没有将'bar'方法绑定到它.
我使用的是phpunit 3.7.5.
提前感谢您的任何意见.我刚刚开始从Zend Framework 1切换到ZF2,在完成快速启动和其他几个教程后,我注意到使用phpunit的'默认'方式有一个短暂的结果.无论是那个还是我只是迷茫而迷茫.
默认项目的文件夹结构是
Project
| - config
| | - autoload
| | | - global.php
| | | - local.php.dist
| | - application.config.php
| - data
| - module
| | - Application
| | | - config
| | | - src
| | | - test
| | | | - ApplicationTest
| | | | - Bootstrap.php
| | | | - phpunit.xml
| | | | - TestConfig.php.dist
| | | - view …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多关于使用测试控制器的文档,$this->call($destination, $parameters, 'GET');但这似乎依赖于正在设置的路由,并且知道使用权$destination.
通常这没关系,但是从路径访问控制器似乎不适合进行单元测试.我想对控制器进行单元测试,而不是路由.是否有标准的单元测试控制器方式,而不处理路由?
只需手动实例化控制器并调用该方法就够了吗?例如
$controller = new MyController;
$response = $controller->someMethod($param);
$this->assertSomething($response);
Run Code Online (Sandbox Code Playgroud)
也许控制器不应该进行单元测试(并且只进行验收测试)并且我的请求表明我的控制器太重了.
使用PHPUnit测试我的控制器时遇到一些问题.
到目前为止我正在编写的代码是实现$_POST或其他请求变量:
$_SERVER['REQUEST_METHOD'] = 'POST';
$_POST = array(
'test' => true
);
Run Code Online (Sandbox Code Playgroud)
大多数测试都以这种方式完美运行,直到我遇到使用filter_input_array函数的方法:
$_SERVER['REQUEST_METHOD'] = 'POST';
$_REQUEST = $_POST = $GLOBALS['_POST'] = array(
'test' => true
);
// ....
var_dump(filter_input_array(INPUT_POST));
Run Code Online (Sandbox Code Playgroud)
空值
我不愿意filter_input从我的代码中删除函数,但我无法让它们在测试中工作.
版本:
PHP 5.5.9-1ubuntu4.9(cli)(内置:2015年4月17日11:44:57)
Apache/2.4.7(Ubuntu)
PHPUnit 4.6.6作者:Sebastian Bergmann和贡献者.
任何帮助将不胜感激.
设置$_SERVER有CONTENT_LENGTH和CONTENT_TYPE没有解决的问题.我的PHP版本不允许我php://stdin按照PHP 5.6.0 chagelog中描述的方式编写(或者我理解它),但是file_put_contents(STDIN,..)成功但无论如何都不起作用.
因为它是一个phpunit测试,也许有一些phpunit.xml我还不知道的注释或条目,可以用php-cgi POST设置方式解决这个问题.
我正在尝试为购物车编写测试类.这是我有的:
ShoppingCartTest.php
class ShoppingCartTest extends TestCase {
use DatabaseTransactions;
protected $shoppingCart;
public function __construct() {
$this->shoppingCart = resolve('App\Classes\Billing\ShoppingCart');
}
/** @test */
public function a_product_can_be_added_to_and_retrieved_from_the_shopping_cart() {
// just a placeholder at the moment
$this->assertTrue(true);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行phpunit时,似乎Laravel无法解析我的ShoppingCartClass.
这是错误:
Fatal error: Uncaught exception 'Illuminate\Contracts\Container\BindingResolutionException'
with message 'Unresolvable dependency resolving
[Parameter #0 [ <required> $app ]] in class Illuminate\Support\Manager'
in C:\Development Server\EasyPHP-Devserver-16.1\eds-www\nrponline\vendor\laravel\framework\src\Illuminate\Container\Container.php:850
Run Code Online (Sandbox Code Playgroud)
我让我的ShoppingCart类在很多不同的控制器中得到解决.
为什么Laravel在测试期间无法解决它?
我也提到了这篇文章,但仍然没有任何运气.
下面的测试通过了,因为true == 1,但我想编写一个失败的测试,因为true !== 1。
$stdClass1 = new stdClass();
$stdClass1->foo = true;
$stdClass2 = new stdClass();
$stdClass2->foo = 1;
$this->assertEquals(
$stdClass1,
$stdClass2
);
Run Code Online (Sandbox Code Playgroud)
以下测试失败,因为这两个变量没有引用同一个对象,但我想编写一个自 以来通过的测试true === true。
$stdClass1 = new stdClass();
$stdClass1->foo = true;
$stdClass2 = new stdClass();
$stdClass2->foo = true;
$this->assertSame(
$stdClass1,
$stdClass2
);
Run Code Online (Sandbox Code Playgroud)
因此,phpunit 是否提供了一种本机方法来比较两个不同的对象,断言它们的属性相同?
我见过一些解决方案(黑客),它们将对象转换为数组然后使用$this->assertEqualsCanonicalizing(),或者序列化对象然后使用this->assertEquals(),等等。然而,这些解决方案对于具有由几种不同数据类型组成的属性的大型对象来说并不理想。分别是,当尝试转换数据类型(例如 DateTime 到 float)时,规范化会失败,或者序列化后产生的错误消息长达数百行,使得查找差异变得很乏味。
因此,phpunit 是否提供了一种本机方法来比较两个不同的对象,断言它们的属性相同?
目前,我们唯一可靠的解决方案是为每个属性编写特定的测试。也许 phpunit 的这个决定是故意的,以便强制进行更健壮的单元测试。
$this->assertSame(
$stdClass1->foo,
$stdClass2->foo
);
Run Code Online (Sandbox Code Playgroud)
尽管我们需要循环遍历所有属性并assertSame针对每个属性,但上述测试可以按需要进行比较对象的目的。
我想创建一个模拟来替换资源:
$gateway = $this->getMockBuilder('PaymentGateway')
->setMethods(['transfer'])
->getMock();
Run Code Online (Sandbox Code Playgroud)
我收到这个警告:
方法“setMethods”已弃用
我该如何解决这个弃用问题?
终端只告诉我There was 1 Warning:。但是我怎样才能看到完整的警告消息以及它是从哪里触发的呢?

--- 这是我的 phpunit.xml 文件
<?xml version="1.0"?>
<phpunit
colors="true"
verbose="true"
stopOnFailure="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
>
<testsuites>
<testsuite name="tests">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
Run Code Online (Sandbox Code Playgroud)