【问题标题】:testing database with binary type in mysql using phpunit使用phpunit在mysql中测试二进制类型的数据库
【发布时间】:2011-10-10 06:04:19
【问题描述】:

我尝试使用 php 为数据库编写测试。我有一个将密码哈希存储为二进制的表。 如何在 xml 数据集中设置测试数据,例如这里是我的数据的十六进制,我得到一个错误数据太长而无法列。 谢谢。

 <dataset>
    <table name="subscription_ips">

     <column>password</column>   
     <row>
       <value>0x771C87E79B130E3FB966E424D7F1358D8DABBA0A26F288C0C1B5D8E3D95F2942100CA54B6824A7AC0964180A9426A1C37C371BA3FDBB000621FE175608C4B16C</value>
     </row>

 </table>

</dataset>

但是貌似phpunit不能插入,使用

0x771C87E79B130E3FB966E424D7F1358D8DABBA0A26F288C0C1B5D8E3D95F2942100CA54B6824A7AC0964180A9426A1C37C371BA3FDBB000621FE175608C4B16C 而不是 0x771C87E79B130E3FB966E424D7F1358D8DABBA0A26F288C0C1B5D8E3D95F2942100CA54B6824A7AC0964180A9426A1C37C371BA3FDBB000621FE175608C4B16C 试图将测试数据插入到表中。

【问题讨论】:

  • 密码字段的数据类型是什么?是BINARY!!
  • 二进制就像 mysql 文档中提到的 char 一样工作。所以你的数据将被截断
  • 这是密码二进制(64)
  • 您能解释一下您的意思吗?
  • 二进制存储为字节。在phpMyAdmin我可以插入比奈例如作为:INSERT INTO试验(密码)VALUES(0x771C87E79B130E3FB966E424D7F1358D8DABBA0A26F288C0C1B5D8E3D95F2942100CA54B6824A7AC0964180A9426A1C37C371BA3FDBB000621FE175608C4B16C)跨度>

标签: php mysql phpunit


【解决方案1】:

这是 MySQL 可以理解的二进制字符串。我怀疑 PHPUnit 不理解它。您可以尝试使用实体引用的 XML 等效项,或者您可能会走运,PHPUnit 使用的解析器支持base64Binary

【讨论】:

  • 请您解释一下您的建议好吗?我去看看链接。
  • 对不起,我不明白你建议如何解决问题。
  • 如果您将 DbUnit 与 PHPUnit 一起使用,请参阅 this answer 以获取示例。我对 DbUnit 不熟悉,但希望它能给你足够的帮助。
  • this blog post,似乎PHPUnit中的数据库扩展是Java的DbUnit的移植。希望这意味着包含 base64 支持。
  • 我怀疑 PHPUnit 的数据库扩展没有这个功能。另一个选项就像我上面写的:使用 XML 实体引用直接嵌入二进制值。它不会很漂亮,但它可能会起作用,因为它完全依赖于处理标准 XML 实体的 XML 解析器。
【解决方案2】:

我现在看到这样的决定,使用替换装饰器:

public function getDataSet($pFileName=null)
{

    if ($pFileName===null) {
        $vFileName = $this->_fixturesDir.'init_flat.xml';
    } else {
        $vFileName = $pFileName;
    }


    $ds = $this->createFlatXmlDataSet($vFileName);
    $rds = new PHPUnit_Extensions_Database_DataSet_ReplacementDataSet($ds);
    $rds->addSubStrReplacement('##HASH_wince4_1318143535##', hash('sha512', 'wince4' . '1318143535', true));
    $rds->addFullReplacement('##NULL##', null);        
    return $rds;        
}

在 flatXML 中: 它似乎不可靠、不方便和可扩展。我们尝试用必要的哈希替换一些文本。我希望任何人都可以提出更合适的问题决定。

【讨论】:

  • 您始终可以创建自己的 ReplacementDataSet 装饰器版本。我创建了一个“HexadecimalAwareDataSet”装饰器,它做了类似的事情,但更具可扩展性。
猜你喜欢
  • 2012-02-21
  • 2011-06-02
  • 2014-08-02
  • 2014-11-01
  • 2015-01-27
  • 2011-05-14
  • 2011-05-08
  • 1970-01-01
相关资源
最近更新 更多