如何使用 MDB2 和 PHPUnit 数据库进行多项测试?

发布于 2024-07-18 10:12:30 字数 1484 浏览 7 评论 0原文

我使用 PHPUnit DataBase 使用 MDB2 测试一些类。

一切都很好,因为我遇到了第二个测试,它返回一个错误:

捕获异常:类的对象 MDB2_Error 无法转换为 字符串

当我将第二个测试代替第一个测试时,新的第一个测试没问题,但第二个测试返回相同的错误! 还有接下来的!

也许 MDB2 连接在第一次测试后就关闭了?

这是我的构造函数:

public function __construct()
{
    $this->pdo = new PDO('connectionstring', 'user', 'passwd');
    try {
        $this->mdb2 = new MyDBA($this->dsn);
    }
    catch (Exception $e) {
        error_log(' __construct Caught exception: '.$e->getMessage());
    }
}

MyDBA 返回一个单例。 构造函数内部不会引发异常...

这是前两个测试:

public function testTranslationAdd()
{
    try {
        $id = $this->mdb2->addTranslation("This is the second english translation.","en");
    }
    catch (Exception $e) {
        error_log(' testTranslationAdd Caught exception: '.$e->getMessage());
    }

    $xml_dataset = $this->createFlatXMLDataSet(dirname(__FILE__).'/state/twotranslations.xml');
    $this->assertDataSetsEqual($xml_dataset,
                               $this->getConnection()->createDataSet(array("translation")));
}

public function testTranslationGet()
{
    try {
        $text = $this->mdb2->getTranslation(1,"en");
    }
    catch (Exception $e) {
        error_log(' testTranslationGet Caught exception: '.$e->getMessage());
    }

    $this->assertEquals("This is the first english translation.",$text);
}

I use PHPUnit DataBase to test some class using MDB2.

All is well, since I encounter the second test, which returns an error:

Caught exception: Object of class
MDB2_Error could not be converted to
string

When I place the second test in place of the first one, the new first test is OK, but the second one returns the same error!
And the next ones also!

Maybe the MDB2 connection is closed after the first test?

Here is my constructor:

public function __construct()
{
    $this->pdo = new PDO('connectionstring', 'user', 'passwd');
    try {
        $this->mdb2 = new MyDBA($this->dsn);
    }
    catch (Exception $e) {
        error_log(' __construct Caught exception: '.$e->getMessage());
    }
}

MyDBA returns a singleton.
No exception is raised inside the constructor...

Here are the two first tests:

public function testTranslationAdd()
{
    try {
        $id = $this->mdb2->addTranslation("This is the second english translation.","en");
    }
    catch (Exception $e) {
        error_log(' testTranslationAdd Caught exception: '.$e->getMessage());
    }

    $xml_dataset = $this->createFlatXMLDataSet(dirname(__FILE__).'/state/twotranslations.xml');
    $this->assertDataSetsEqual($xml_dataset,
                               $this->getConnection()->createDataSet(array("translation")));
}

public function testTranslationGet()
{
    try {
        $text = $this->mdb2->getTranslation(1,"en");
    }
    catch (Exception $e) {
        error_log(' testTranslationGet Caught exception: '.$e->getMessage());
    }

    $this->assertEquals("This is the first english translation.",$text);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

尐偏执 2024-07-25 10:12:30

您确实应该添加断言,表明您的 mdb2 结果没有错误:

$this->assertFalse(MDB2::isError($this->mdb2), 'MDB2 error');

不幸的是,这并没有给您任何提示错误是什么,并且如果您不这样做,直接在断言中使用 getMessage() 将严重失败有错误。 这就是为什么你应该这样写一些东西:

if (MDB2::isError($this->mdb2)) {
    $this->fail('MDB2 error: ' . $this->mdb2->getMessage());
}

You should really add assertions that your mdb2 result is no error:

$this->assertFalse(MDB2::isError($this->mdb2), 'MDB2 error');

That unfortunately does not give you any hint what the error is, and using getMessage() directly in the assertion will fail badly if you don't have an error. That why you should write something along that way:

if (MDB2::isError($this->mdb2)) {
    $this->fail('MDB2 error: ' . $this->mdb2->getMessage());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文