当我使用PHPUnit对我的PHP代码进行单元测试时,我试图找出模拟对象的正确方法,而不是模仿它的任何方法.
问题是,如果我不调用getMockBuilder()->setMethods()
,那么对象上的所有方法都将被模拟,我无法调用我想要测试的方法; 但如果我不打电话setMethods()
,然后我需要告诉它嘲笑什么方法,但我不希望在所有的嘲笑任何方法.但我需要创建模拟,这样我就可以避免在测试中调用构造函数.
这是我想要测试的方法的一个简单示例:
class Foobar
{
public function __construct()
{
// stuff happens here ...
}
public function myMethod($s)
{
// I want to test this
return (strlen($s) > 3);
}
}
Run Code Online (Sandbox Code Playgroud)
我可能测试myMethod()
:
$obj = new Foobar();
$this->assertTrue($obj->myMethod('abcd'));
Run Code Online (Sandbox Code Playgroud)
但这会叫Foobar的构造函数,这是我不想要的.所以相反,我会尝试:
$obj = $this->getMockBuilder('Foobar')->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
Run Code Online (Sandbox Code Playgroud)
但是getMockBuilder()
不使用调用setMethods()
将导致其所有方法被模拟并返回null,因此我的调用myMethod()
将返回null而不触及我打算测试的代码.
到目前为止我的解决方法是:
$obj = $this->getMockBuilder('Foobar')->setMethods(array('none'))
->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
Run Code Online (Sandbox Code Playgroud)
这将模拟名为'none'的方法,该方法不存在,但PHPUnit并不关心.它会让myMethod()取消模拟,以便我可以调用它,它也会让我禁用构造函数,这样我就不会调用它.完善!除了必须指定一个不存在的方法名称 - "无",或"blargh"或"xyzzy"之外,似乎在作弊.
这样做的正确方法是什么?
我没有看到明确的方法来做到这一点,虽然我可以看到它在文档中被重复多次,具体来说:
使用yii migrate工具将测试数据库升级到最新版本;
发现于http://www.yiiframework.com/doc-2.0/guide-test-fixture.html#summary(仅举例)
会发生什么,无论我如何配置_console.php
和_config.php
在我的tests/unit
文件夹中,如果我运行迁移工具正在拿起主app db:
$ cd tests/unit
$ ../../yii migrate/up
Yii Migration Tool (based on Yii v2.0.0-dev)
No new migration found. Your system is up-to-date.
Run Code Online (Sandbox Code Playgroud)
是的,测试数据库已正确配置(运行测试将抛出错误,表示没有表).我显然可以自己创建数据库结构,但这都是为了让这个功能正常工作.
我目前正在使用通过composer安装的Basic应用程序.
我是joomla的新手,当前使用的是Joomla 3.6版。有没有一种方法可以将tinymce编辑器设置为使用div标签作为默认值而不是段落?任何答案将不胜感激,非常感谢。