我正在编写测试用例,这是我的一个问题.
所以说我正在测试一个简单的函数 someClass::loadValue($value)
正常的测试用例很简单,但假设在传入null或-1时,函数调用会生成一个PHP警告,这被认为是一个错误.
问题是,如何编写我的PHPUnit测试用例,以便在函数正常处理null/-1时成功,并在抛出PHP警告时失败?
谢谢,
我创建了以下界面:
<?php
interface Action
{
public function execute(\requests\Request $request, array $params);
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用PHPUnit 3.4创建此接口的Mock对象,但是我收到以下错误:
致命错误:Mock_Action_b389c0b1 :: execute()的声明必须与D:\ Xampp\xampp\php\PEAR\PHPUnit\Framework\TestCase.php(1121)中的Action :: execute()的声明兼容:eval()' d代码在第2行
我查看了从PHPUnit获得的堆栈跟踪,发现它创建了一个实现接口Action的Mock对象,但是以下列方式创建了execute方法:
<?php
public function execute($request, array $params)
Run Code Online (Sandbox Code Playgroud)
如您所见,PHPUnit接管数组类型提示,但忘记了\ requests\Request.这显然会导致错误.有谁知道这个错误的解决方法?
我也尝试过没有命名空间,但我仍然得到同样的错误.
是否可以使用PHPUnit将测试标记为"预期失败"?这在执行TDD时很有用,并且您希望区分真正失败的测试和由于尚未编写相关代码而导致失败的测试.
我想在我正在测试的同一个类中模拟一个方法.
ClassA {
function hardToTest($arg) {
// difficult to test code
}
function underTest() {
return $this->hardToTest('foo');
}
}
Run Code Online (Sandbox Code Playgroud)
我以为我可以用反射来做这件事,但也许这只是我应该hardToTest进入另一个对象的一个标志.
跑步的时候
我收到错误
Warning: require(PHPUnit/Autoload.php): failed to open stream: No such file or directory in /usr/local/bin/phpunit on line 42
Fatal error: require(): Failed opening required 'PHPUnit/Autoload.php' (include_path='.:') in /usr/local/bin/phpunit on line 42
Run Code Online (Sandbox Code Playgroud)
/ usr/local/bin/phpunit在第42行显示以下内容:
require 'PHPUnit/Autoload.php';
Run Code Online (Sandbox Code Playgroud)
任何建议如何解决这个问题?
更新(1):
我在/ etc /中缺少php.ini,所以我通过符号链接来阅读MAMP php.ini.现在我明白了
php -r 'foreach (explode(":", get_include_path()) as $path) echo $path . PHP_EOL;'
.
/Applications/MAMP/bin/php/php5.3.6/lib/php
/usr/local/bin/pear
/usr/local/share/pear/PHPUnit
Run Code Online (Sandbox Code Playgroud)
赛跑
正在运行但不提供输出.
有什么建议接下来要检查什么?
更新(2):
可能这个问题的根本原因与问题有关
<phpunit backupGlobals="false" colors="true">
<testsuite name="app1" >
<directory>./app1</directory>
</testsuite>
<testsuite name="app1" >
<directory>./app2</directory>
</testsuite>
</phpunit>
Run Code Online (Sandbox Code Playgroud)
我如何使第一和第二testuite加载不同的bootstraps?
我已经通过Composer安装了PHPUnit并将其设置为通过设置安装我的单元测试.
但是当我运行测试时,测试报告器会出现以下错误(tets执行得很好):
无法将测试报告者附加到测试框架或测试框架意外退出
我有PHPStorm 8.0.1.
PHPUnit通过PHAR存档安装,如:
wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
sudo mv phpunit.phar /usr/bin/phpunit
Run Code Online (Sandbox Code Playgroud)
PHPUnit通过cli工作:
user@pc:/usr/bin$ cd ~
user@pc:~$ phpunit --version
PHPUnit 4.3.5 by Sebastian Bergmann.
Run Code Online (Sandbox Code Playgroud)
我按照JetBrains网站上的说明https://www.jetbrains.com/phpstorm/webhelp/enabling-phpunit-support.html#d298258e897
在PHPStorm文件 - >设置选项卡PHP/PHPUnit Path to phpunit.phar中选中单选按钮并将值设置为/usr/bin/phpunit
我有一个测试定义如下的文件:
class MyTest extends PHPUnit_Framework_TestCase {
...
Run Code Online (Sandbox Code Playgroud)
此时PHPStorm标志着 Undefined class PHPUnit_Framework_TestCase
我重新启动了PHPStorm和计算机,但仍然遇到了同样的问题.
我也尝试添加/usr/bin包含路径(右键单击项目视图中的外部库,并选择选项Configure PHP include paths)但没有成功.
这是PHPStorm设置的配置,选项卡PHP(如果重要):
PHP Language level: 5.5 (finally, generators, etc.)
Interpreter: PHP 5.5 (5.5.9-1ubuntu4.5)
Include path is empty
Run Code Online (Sandbox Code Playgroud) 我在/my/example/page链接到laravel路线的页面上有一个链接my.route.
路线
Route::group(['middleware' => ['auth']], function () {
Route::group(['middleware' => ['Some\Custom\Auth\Middleware:1']], function () {
Route::match(['GET', 'POST'], '/my/route/to/external/controller', 'exampleController@externalLink')->name('my.route');
}
}
Run Code Online (Sandbox Code Playgroud)
链接 /my/example/page
<a href="/my/route/to/external/controller">Link</a>
Run Code Online (Sandbox Code Playgroud)
此路由/my/route/to/external/controller指向控制器externalLink中的此控制器方法,该方法exampleController返回要使用的href的url
public function externalLink()
{
return $this->redirect->away('www.externalsite.com');
}
Run Code Online (Sandbox Code Playgroud)
我的考试是
$this->visit(/my/example/page)
->click('Link')
->assertRedirectedToRoute('my.route');
Run Code Online (Sandbox Code Playgroud)
我不断得到错误
Symfony的\分量\ HttpKernel \异常\ NotFoundHttpException
当我使用click()测试方法.
我可以使用它,@expectedException但他没有帮助,因为我希望看到一个不同的页面.
我也试过(不在一起);
->assertResponseStatus(200);
->seePageIs('www.externalsite.com');
->assertRedirect();
->followRedirects();
Run Code Online (Sandbox Code Playgroud)
从浏览器检查,当点击网址时,我得到了
http://www.example.com/my/route/to/external 302
http://www.externalsite.com 200
Run Code Online (Sandbox Code Playgroud)
如何在功能上测试被点击的按钮并重定向到外部站点?
我正在锁定一种模拟对象并填充其属性的方法.以下是使用另一个对象的属性的方法示例:
class MyClass {
private $_object;
public function methodUnderTest($object) {
$this->_object = $object;
return $this->_object->property
}
}
Run Code Online (Sandbox Code Playgroud)
要单元测试这个方法我应该$object用getMockBuilder()方法创建一个模拟PHPUnit.但我找不到一种方法来模拟属性$object,只是方法.