我如何从PHP,重新创建我的数据库,可能插入默认数据.目前,我打算使用单元测试的行为.
我使用Doctrine 2,Zend Framework 1.11 Zend_Test进行单元测试
我可以使用CLI
doctrine orm:schema-tool:update --force
Run Code Online (Sandbox Code Playgroud)
要么
doctrine orm:schema-tool:drop --force
doctrine orm:schema-tool:create
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个PHP替代品,到目前为止找到了这个
但它看起来像
$tool = new \Doctrine\ORM\Tools\SchemaTool($em);
$classes = array(
$em->getClassMetadata('Entities\User'),
$em->getClassMetadata('Entities\Profile')
);
$tool->dropSchema($classes, \Doctrine\ORM\Tools\SchemaTool::DROP_DATABASE);
$tool->createSchema($classes);
Run Code Online (Sandbox Code Playgroud)
而且我真的不想指定模型类,尤其是当它们可以改变时.它应该只读取下面...中指定的所有类...就像使用CLI一样,您不需要指定所需的类?
$driverImpl = $config->newDefaultAnnotationDriver(array(realpath('../models')));
$config->setMetadataDriverImpl($driverImpl);
Run Code Online (Sandbox Code Playgroud) 我一直在花时间去理解编写可测试代码背后的方法,我偶然发现了Misko Hevery的一篇好文章,他清楚地解释了如何在应用程序构建中处理依赖关系,例如使用工厂加载所有对象,从而减少行使测试复杂化的依赖项
在他的帖子中,他提供了一个最小但尽管很有见地的例子,说明了他如何在java中设置应用程序,以下无耻地引用了以下内容:
// Your main should look like this:
class Main {
public static void main(String…args) {
AppFactory factory = new AppFactory(args);
MyApp app = factory.create();
app.run();
}
}
Run Code Online (Sandbox Code Playgroud)
然后他说:
请注意代码如何分为三个阶段.创建工厂,创建应用程序,运行应用程序 这使得它可以测试.无论你的应用是什么,你都应该放弃这种模式.为了让单例到正确的位置,Factory只创建一个实例,然后在调用new时将该实例传递给所有类的构造函数.请参阅:http://misko.hevery.com/2009/03/30/collaborator-vs-the-factory/
我不擅长Java,但是假设这可以在php中模仿,当然减去main()方法,但是在网络应用程序的上下文中$ args会来自哪里?和初始化?
我会非常有兴趣在PHP中看到一个最小的可测试应用程序示例,甚至是那些认为测试效率高的应用程序的链接.初始化是我很好奇的,主要是.我的目的不是复制粘贴,而是从经验丰富的OOP编码器提供的内容中学习.
我翻过几个流行代码库的代码:Zend,Symphony,但这些框架不是可运行的应用程序,看起来"太快太快",让我无法掌握清晰的画面.此外,在有关测试实践的框架中也指出了一些不足之处.只是一个小例子,如果可能的话(即使不可运行)会让我在从头开始创建一个小应用程序时更好地掌握正确的OOP代码布局实践.
我有一个抽象类,其中包含常用方法,我希望测试,所以我不必在扩展此类的每个类中继续测试它们.
abstract class Class1 implements iClass1
{
const VALUE = 'A';
private $Return;
public function __construct($Field = NULL)
{
if( ! is_null($Field) )
$this->SetField($Field);
}
public function GetField()
{
return $this->Return;
}
public function SetField($Field)
{
if (strlen($Field) != 3)
throw new CLASS1_EXCEPTION('Field "' . $Field . '" must be 3 digits.');
$this->Return = $FieldCode;
}
abstract function CalculateData();
}
Run Code Online (Sandbox Code Playgroud)
我想创建基本的测试用例,然后测试构造函数,GetField和其他函数,然后我的其他测试文件可以测试抽象函数.
我希望能够测试const没有改变,字段抛出异常等...
测试:
class TEST_CLASS1 extends PHPUnit_Framework_TestCase
{
protected function setUp()
{
require_once('CLASS1.php');
}
public function testConstants()
{
$this->assertEquals(CLASS1, 'A'); …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个模拟来满足使用此代码的类型提示(Mockery):
return \Mockery::mock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)
或者这个(PHPUnit):
return $this->getMock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)
但返回的模拟称为Mockery\Mock Object或Mock_iFileSystemWrapper_a5f91049.当它不是我需要的任何一个框架的实例时,我该如何键入检查?
为什么模拟框架试图加载真正的类?如果我想要真正的课程,我会包括真正的课程.
这个问题在编写测试时已经减慢了很多次,我只是抛出类型暗示窗口并检查类名,或者只是使用生产对象,因为模拟很难使用.
有没有办法在Symfony 2应用程序中正确单元测试Doctrine模型?现在我正在编写通过控制器的功能测试,以确保我的应用程序正确存储(和CRUDing)数据.但这需要太长时间而且非常糟糕,因为我必须为每个套件设置灯具,并在套件完成后清除数据库.
我如何隔离Entity和EntityRepository单元测试?有关于此的教程吗?
在添加ArrayCollection成员的表单的功能测试中,有以下声明:
$ form ['client [members] [1] [fname]'] ='Benny';
使用DOM检查器验证了字段名称.
此行的控制台输出是:
InvalidArgumentException: Unreachable field "members"
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:459
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:496
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:319
G:\Documents\workspace\sym\src\Mana\ClientBundle\Tests\Controller\ClientControllerTest.php:57
Run Code Online (Sandbox Code Playgroud)
应该使用什么方法来测试添加ArrayCollection成员?
Run Code Online (Sandbox Code Playgroud)//link to trigger adding household member form $link = $crawler->selectLink('Add household member')->link(); $crawler = $client->click($link); $form = $crawler->selectButton('Add client')->form(); $form['client[members][1][fname]'] = 'Benny'; $form['client[members][1][dob]'] = "3/12/1999"; $crawler = $client->submit($form); $this->assertTrue($crawler->filter('html:contains("Client View Form")')->count() > 0);
我是任何一种测试的新手.我刚刚使用这个doc安装了pear和PHPUnit .我使用netbeans 7.3.1.我还安装了skeletongenerator运行此命令:pear install phpunit/PHPUnit_SkeletonGenerator.
我按照PHPUnit中的测试中列出的步骤将PHPUnit集成到netbeans中.
如Installing PHPUnit该文档部分所述,通过单击我的netbeans search下的按钮可Netbeans->preferences->unit testing识别PHPUnit安装.
我按照所有步骤添加了示例Calculator项目并生成了测试类.我做到了 但是当我通过右键单击Calculator.php文件并选择Test我得到以下结果来运行测试时.

输出窗口没有任何用处:

我不知道可能是什么问题以及如何解决这个问题.
很少有怀疑,认为可能是造成上述问题:
我应该加入Global include path下Netbeans->preferences->general?
我需要require_once在Calculator.php文件中添加语句吗?
我是否只需要在某个特定文件夹下创建php项目,或者我放置项目的位置是不重要的?
如何检查PHPUnit是否已正确安装并且正在运行?
还有许多其他症状我甚至无法想到.
谢谢.
我正在使用PHPUnit并尝试检查页面上是否存在文本.assertRegExp工作但使用if语句我得到错误Failed asserting that null is true.
我知道$ test返回null,但是如果文本存在,我不知道如何让它返回1或0或true/false?任何帮助都表示感谢.
$element = $this->byCssSelector('body')->text();
$test = $this->assertRegExp('/find this text/i',$element);
if($this->assertTrue($test)){
echo 'text found';
}
else{
echo 'not found';
}
Run Code Online (Sandbox Code Playgroud) 有没有办法在使用phpunit进行单元测试时对从'error_log("Message")调用创建的输出运行测试?
示例代码,我的一个函数使用luhn算法测试信用卡:
if($checkLuhn && ($this->_luhn_check($cardNumber) == false)) {
error_log(__METHOD__ . " cardNumber failed luhn algorithm check.");
return false;
}
Run Code Online (Sandbox Code Playgroud)
$ checkLuhn是传入的布尔值,告诉它是否进行检查,如果$ cardNumber通过,_luhn_check()返回true.问题是,我在这个函数中有多个测试可以返回false.我可以在返回值上使用assertEquals,但也想检查抛出错误的原因.
您可以覆盖error_log或以其他方式在单元测试中获取syslog输出吗?
我想写一个单元测试,应该检查未经身份验证的用户是否可以查看用户列表(他不应该这样做).
我的路线
Route::group(array('prefix' => 'admin'), function() {
Route::get('login', function() {
return View::make('auth.login');
});
Route::post('login', function() {
Auth::attempt( array('email' => Input::get('email'), 'password' => Input::get('password')) );
return Redirect::intended('admin');
});
Route::get('logout', 'AuthController@logout');
Route::group(array('before' => 'auth'), function() {
Route::get('/', function() {
return Redirect::to('admin/users');
});
Route::resource('users', 'UsersController');
});
});
Run Code Online (Sandbox Code Playgroud)
我的考试
public function testUnauthenticatedUserIndexAccess() {
$response = $this->call('GET', 'admin/users');
$this->assertRedirectedTo('admin/login');
}
Run Code Online (Sandbox Code Playgroud)
我的过滤器
Route::filter('auth', function() {
if (Auth::guest()) return Redirect::guest('admin/login');
});
Run Code Online (Sandbox Code Playgroud)
结果
声明Illuminate\Http\Response Object(...)是类"Illuminate\Http\RedirectResponse"的实例失败.
如果我从测试中记录$ response,它会显示完整的用户列表,就像管理员在测试期间登录一样.
如果我使用浏览器浏览管理员/用户而没有登录我被重定向到像我应该登录,所以auth过滤器确实在工作.
问题
phpunit ×10
php ×6
unit-testing ×3
doctrine-orm ×2
symfony ×2
assert ×1
laravel ×1
laravel-4 ×1
mockery ×1
mocking ×1
netbeans ×1
netbeans-7.3 ×1
pear ×1
syslog ×1
zend-test ×1