Php 使用MongoDB和对象阵列进行Laravel单元测试

Php 使用MongoDB和对象阵列进行Laravel单元测试,php,mongodb,unit-testing,laravel,Php,Mongodb,Unit Testing,Laravel,你好,我对PHPUnit和Laravel 4还很陌生。 我已经创建了一个RESTAPI,并试图使用laravel(PHPUnit)单元测试将一个新用户添加到我的测试数据库中。问题是,它完全忽略了我试图在创建用户文档时添加的对象数组 典型的用户文档如下所示: { _id": ObjectId("53021089b4d15220118b4568"), "oArr": { "something": { "somewhere": "5th Avenue",

你好,我对PHPUnit和Laravel 4还很陌生。 我已经创建了一个RESTAPI,并试图使用laravel(PHPUnit)单元测试将一个新用户添加到我的测试数据库中。问题是,它完全忽略了我试图在创建用户文档时添加的对象数组

典型的用户文档如下所示:

{
    _id": ObjectId("53021089b4d15220118b4568"),
   "oArr": {
     "something": {
          "somewhere": "5th Avenue",
          "ip": "192.168.0.20"
     },
     "something2": {
          "somewhere": "6th Avenue",
          "ip": "192.168.0.21"
     }
  }
   "email": "jessica@example.com",
   "name": "Jessica Alba",
   "password": "$2y$10$RAVzUGLAG.81IOOUum0k0u5vrcY98H.L42FeSJekEywUCV.ycttn6"
}
{
    _id": ObjectId("53021089b4d15220118b4568"),
   "email": "emma@example.com",
   "name": "Emma Watson",
   "password": "$2y$10$asdAzUGLAG.8asvWQOUum0k0u5vrcY98H.LEDeSJekEywUCV.ycttn6"
}
现在,Laravel有了自己的测试类
TestCase
,您的单元测试可以扩展它。 典型示例如下:

class AddUserTest extends TestCase {

    /**
     * A basic functional test example.
     *
     * @return void
     */


    public function testCreateUsers()
    {
      $post_data = array(
          'email' => 'emma@example.com',
          'name' => 'Emma Watson',
          'password' => 'password',
          'oArr' => array(
              'something' => array(
                  'somewhere' => '7th Avenue',
                  'ip' : => '192.168.0.31'
              ),
          ),
      );
    }
}
一旦用户测试成功运行,新的Emma Watson用户(Mongo Doc)如下所示:

{
    _id": ObjectId("53021089b4d15220118b4568"),
   "oArr": {
     "something": {
          "somewhere": "5th Avenue",
          "ip": "192.168.0.20"
     },
     "something2": {
          "somewhere": "6th Avenue",
          "ip": "192.168.0.21"
     }
  }
   "email": "jessica@example.com",
   "name": "Jessica Alba",
   "password": "$2y$10$RAVzUGLAG.81IOOUum0k0u5vrcY98H.L42FeSJekEywUCV.ycttn6"
}
{
    _id": ObjectId("53021089b4d15220118b4568"),
   "email": "emma@example.com",
   "name": "Emma Watson",
   "password": "$2y$10$asdAzUGLAG.8asvWQOUum0k0u5vrcY98H.LEDeSJekEywUCV.ycttn6"
}
我不知道怎么做,也找不到其他有同样问题的人

我的假设:我使用的ORM()不适合单元测试中的对象数组


我还没有研究ORM是如何处理单元测试的,我只是希望其他人也有同样的问题,并且有一个更基本的解决方案。

好吧,您的测试返回了修改过的文档。Mongodb会自动将新的\u id附加到未明确标记为更新的每个插入中。此外,mongo正在对您的密码进行哈希运算——这可能是由您的包驱动程序完成的。因为mongodb使用的是嵌套文档,所以您的测试可能没有达到该嵌套级别,并且没有该文档。

好的,您的测试返回了修改过的文档。Mongodb会自动将新的\u id附加到未明确标记为更新的每个插入中。此外,mongo正在对您的密码进行哈希运算——这可能是由您的包驱动程序完成的。由于mongodb正在使用嵌套文档,您的测试可能没有达到该嵌套级别,并且没有该文档。

完全忘记了这篇文章。
Laravel的
Input
类也处理JSON输入。因此,如果您试图发布嵌入的文档,不妨使用JSON格式。以下几点对我有用

class AddUserTest extends TestCase {

    /**
     * A basic functional test example.
     *
     * @return void
     */


    public function testCreateUsers()
    {
      $post_data = array(
          'email' => 'emma@example.com',
          'name' => 'Emma Watson',
          'password' => 'password',
          'oArr' => array(
              'something' => array(
                  'somewhere' => '7th Avenue',
                  'ip' : => '192.168.0.31'
              ),
          ),
      );
      $post_data = json_encode($post_data);
      // Send through the serialized data to the Controller.
    }
}

完全忘记了这篇文章。
Laravel的
Input
类也处理JSON输入。因此,如果您试图发布嵌入的文档,不妨使用JSON格式。以下几点对我有用

class AddUserTest extends TestCase {

    /**
     * A basic functional test example.
     *
     * @return void
     */


    public function testCreateUsers()
    {
      $post_data = array(
          'email' => 'emma@example.com',
          'name' => 'Emma Watson',
          'password' => 'password',
          'oArr' => array(
              'something' => array(
                  'somewhere' => '7th Avenue',
                  'ip' : => '192.168.0.31'
              ),
          ),
      );
      $post_data = json_encode($post_data);
      // Send through the serialized data to the Controller.
    }
}

在本例中,哈希由API框架(Laravel)完成。所有信息在放入Mongo之前都已准备好并格式化。在本例中,哈希是由API框架(Laravel)完成的。所有信息在放入Mongo之前都已准备好并格式化。