diff --git a/composer.json b/composer.json
index 7a418a5..c3c30c0 100644
--- a/composer.json
+++ b/composer.json
@@ -32,6 +32,9 @@
     },
     "require-dev": {
         "symfony/var-dumper": "^3.3",
-        "phpunit/phpunit": "^7.5"
+        "phpunit/phpunit": "^8.5"
+    },
+    "scripts": {
+        "test": "./vendor/bin/phpunit"
     }
 }
diff --git a/src/Dom/Query.php b/src/Dom/Query.php
index 40026a0..16635ad 100644
--- a/src/Dom/Query.php
+++ b/src/Dom/Query.php
@@ -52,7 +52,7 @@ class Query
     {
         $this->html = value($html);
         $this->destroyDocument();
-        $this->document = phpQuery::newDocumentHTML($this->html,$charset);
+        $this->document = phpQuery::newDocumentHTML($this->html, $charset);
         return $this->ql;
     }
 
@@ -64,7 +64,7 @@ class Query
      */
     public function getData(Closure $callback = null)
     {
-        return  is_null($callback) ? $this->data : $this->data->map($callback);
+        return $this->handleData($this->data, $callback);
     }
 
     /**
@@ -125,7 +125,7 @@ class Query
      */
     public function removeHead()
     {
-        $html = preg_replace('/<head.+?>.+<\/head>/is','<head></head>',$this->html);
+        $html = preg_replace('/<head.+?>.+<\/head>/is', '<head></head>', $this->html);
         $this->setHtml($html);
         return $this->ql;
     }
@@ -139,24 +139,37 @@ class Query
     public function query(Closure $callback = null)
     {
         $this->data = $this->getList();
-        $callback && $this->data = $this->data->map($callback);
+        $this->data = $this->handleData($this->data, $callback);
         return $this->ql;
     }
 
+    public function handleData(Collection $data, $callback)
+    {
+        if (is_callable($callback)) {
+            if (empty($this->range)) {
+                $data = collect($callback($data->all(), null));
+            } else {
+                $data = $data->map($callback);
+            }
+        }
+
+        return $data;
+    }
+
     protected function getList()
     {
         $data = [];
         if (empty($this->range)) {
-            foreach ($this->rules as $key => $reg_value){
+            foreach ($this->rules as $key => $reg_value) {
                 $rule = $this->parseRule($reg_value);
                 $contentElements = $this->document->find($rule['selector']);
                 $data[$key] = $this->extractContent($contentElements, $key, $rule);
             }
         } else {
-            $rangeElements  = $this->document->find($this->range);
+            $rangeElements = $this->document->find($this->range);
             $i = 0;
             foreach ($rangeElements as $element) {
-                foreach ($this->rules as $key => $reg_value){
+                foreach ($this->rules as $key => $reg_value) {
                     $rule = $this->parseRule($reg_value);
                     $contentElements = pq($element)->find($rule['selector']);
                     $data[$i][$key] = $this->extractContent($contentElements, $key, $rule);
@@ -175,7 +188,7 @@ class Query
                 $content = $this->allowTags($pqObj->html(), $rule['filter_tags']);
                 break;
             case 'texts':
-                $content = (new Elements($pqObj))->map(function(Elements $element) use($rule){
+                $content = (new Elements($pqObj))->map(function (Elements $element) use ($rule) {
                     return $this->allowTags($element->html(), $rule['filter_tags']);
                 })->all();
                 break;
@@ -183,7 +196,7 @@ class Query
                 $content = $this->stripTags($pqObj->html(), $rule['filter_tags']);
                 break;
             case 'htmls':
-                $content = (new Elements($pqObj))->map(function(Elements $element) use($rule){
+                $content = (new Elements($pqObj))->map(function (Elements $element) use ($rule) {
                     return $this->stripTags($element->html(), $rule['filter_tags']);
                 })->all();
                 break;
@@ -191,7 +204,7 @@ class Query
                 $content = $this->stripTags($pqObj->htmlOuter(), $rule['filter_tags']);
                 break;
             case 'htmlOuters':
-                $content = (new Elements($pqObj))->map(function(Elements $element) use($rule){
+                $content = (new Elements($pqObj))->map(function (Elements $element) use ($rule) {
                     return $this->stripTags($element->htmlOuter(), $rule['filter_tags']);
                 })->all();
                 break;
@@ -200,7 +213,7 @@ class Query
                 break;
         }
 
-        if(is_callable($rule['handle_callback'])){
+        if (is_callable($rule['handle_callback'])) {
             $content = call_user_func($rule['handle_callback'], $content, $ruleName);
         }
 
@@ -220,49 +233,47 @@ class Query
 
     /**
      * 去除特定的html标签
-     * @param  string $html
-     * @param  string $tags_str 多个标签名之间用空格隔开
+     * @param string $html
+     * @param string $tags_str 多个标签名之间用空格隔开
      * @return string
      */
-    protected function stripTags($html,$tags_str)
+    protected function stripTags($html, $tags_str)
     {
         $tagsArr = $this->tag($tags_str);
-        $html = $this->removeTags($html,$tagsArr[1]);
+        $html = $this->removeTags($html, $tagsArr[1]);
         $p = array();
         foreach ($tagsArr[0] as $tag) {
-            $p[]="/(<(?:\/".$tag."|".$tag.")[^>]*>)/i";
+            $p[] = "/(<(?:\/" . $tag . "|" . $tag . ")[^>]*>)/i";
         }
-        $html = preg_replace($p,"",trim($html));
+        $html = preg_replace($p, "", trim($html));
         return $html;
     }
 
     /**
      * 保留特定的html标签
-     * @param  string $html
-     * @param  string $tags_str 多个标签名之间用空格隔开
+     * @param string $html
+     * @param string $tags_str 多个标签名之间用空格隔开
      * @return string
      */
-    protected function allowTags($html,$tags_str)
+    protected function allowTags($html, $tags_str)
     {
         $tagsArr = $this->tag($tags_str);
-        $html = $this->removeTags($html,$tagsArr[1]);
+        $html = $this->removeTags($html, $tagsArr[1]);
         $allow = '';
         foreach ($tagsArr[0] as $tag) {
             $allow .= "<$tag> ";
         }
-        return strip_tags(trim($html),$allow);
+        return strip_tags(trim($html), $allow);
     }
 
     protected function tag($tags_str)
     {
-        $tagArr = preg_split("/\s+/",$tags_str,-1,PREG_SPLIT_NO_EMPTY);
-        $tags = array(array(),array());
-        foreach($tagArr as $tag)
-        {
-            if(preg_match('/-(.+)/', $tag,$arr))
-            {
+        $tagArr = preg_split("/\s+/", $tags_str, -1, PREG_SPLIT_NO_EMPTY);
+        $tags = array(array(), array());
+        foreach ($tagArr as $tag) {
+            if (preg_match('/-(.+)/', $tag, $arr)) {
                 array_push($tags[1], $arr[1]);
-            }else{
+            } else {
                 array_push($tags[0], $tag);
             }
         }
@@ -271,17 +282,16 @@ class Query
 
     /**
      * 移除特定的html标签
-     * @param  string $html
-     * @param  array  $tags 标签数组
+     * @param string $html
+     * @param array $tags 标签数组
      * @return string
      */
-    protected function removeTags($html,$tags)
+    protected function removeTags($html, $tags)
     {
         $tag_str = '';
-        if(count($tags))
-        {
+        if (count($tags)) {
             foreach ($tags as $tag) {
-                $tag_str .= $tag_str?','.$tag:$tag;
+                $tag_str .= $tag_str ? ',' . $tag : $tag;
             }
 //            phpQuery::$defaultCharset = $this->inputEncoding?$this->inputEncoding:$this->htmlEncoding;
             $doc = phpQuery::newDocumentHTML($html);
@@ -294,7 +304,7 @@ class Query
 
     protected function destroyDocument()
     {
-        if($this->document instanceof phpQueryObject) {
+        if ($this->document instanceof phpQueryObject) {
             $this->document->unloadDocument();
         }
     }
diff --git a/tests/Dom/FindTest.php b/tests/Dom/FindTest.php
index acf5c84..024df21 100644
--- a/tests/Dom/FindTest.php
+++ b/tests/Dom/FindTest.php
@@ -17,7 +17,7 @@ class FindTest extends TestCaseBase
     protected $html;
     protected $ql;
 
-    public function setUp()
+    protected function setUp(): void
     {
         $this->html = $this->getSnippet('snippet-1');
         $this->ql = QueryList::html($this->html);
diff --git a/tests/Dom/RulesTest.php b/tests/Dom/RulesTest.php
index d2d70a7..7c555ca 100644
--- a/tests/Dom/RulesTest.php
+++ b/tests/Dom/RulesTest.php
@@ -18,7 +18,7 @@ class RulesTest extends TestCaseBase
     protected $html;
     protected $ql;
 
-    public function setUp()
+    protected function setUp(): void
     {
         $this->html = $this->getSnippet('snippet-2');
         $this->ql = QueryList::html($this->html);
diff --git a/tests/Feature/HttpTest.php b/tests/Feature/HttpTest.php
index cba79e3..0d723ed 100644
--- a/tests/Feature/HttpTest.php
+++ b/tests/Feature/HttpTest.php
@@ -18,7 +18,7 @@ class HttpTest extends TestCaseBase
 {
     protected $urls;
 
-    public function setUp()
+    protected function setUp(): void
     {
         $this->urls = [
             'http://httpbin.org/get?name=php',
diff --git a/tests/Feature/InstanceTest.php b/tests/Feature/InstanceTest.php
index 58c268d..a659060 100644
--- a/tests/Feature/InstanceTest.php
+++ b/tests/Feature/InstanceTest.php
@@ -16,7 +16,7 @@ class InstanceTest extends TestCaseBase
 {
     protected $html;
 
-    public function setUp()
+    protected function setUp(): void
     {
         $this->html = $this->getSnippet('snippet-1');
     }
@@ -38,11 +38,11 @@ class InstanceTest extends TestCaseBase
     public function get_new_object()
     {
         $ql = (new QueryList())->html($this->html);
-        $ql2 = new QueryList();
+        $ql2 = (new QueryList())->html('');
         $this->assertNotEquals($ql->getHtml(),$ql2->getHtml());
 
         $ql = QueryList::range('')->html($this->html);
-        $ql2 = QueryList::range('');
+        $ql2 = QueryList::range('')->html('');
         $this->assertNotEquals($ql->getHtml(),$ql2->getHtml());
     }
 }
\ No newline at end of file
diff --git a/tests/Feature/MethodTest.php b/tests/Feature/MethodTest.php
index 684cbd0..ca10cf9 100644
--- a/tests/Feature/MethodTest.php
+++ b/tests/Feature/MethodTest.php
@@ -16,7 +16,7 @@ class MethodTest extends TestCaseBase
 {
     protected $html;
 
-    public function setUp()
+    protected function setUp(): void
     {
         $this->html = $this->getSnippet('snippet-1');
     }
@@ -30,7 +30,7 @@ class MethodTest extends TestCaseBase
         $qlHtml = QueryList::pipe(function(QueryList $ql) use($html){
             $ql->setHtml($html);
             return $ql;
-        })->getHtml();
+        })->getHtml(false);
         $this->assertEquals($html,$qlHtml);
     }
 }
\ No newline at end of file