1import{_ as l,c as h,a as k,b as a,e as i,d as n,w as e,r as p,o as d}from"./app-C1L7GXRS.js";const r={};function o(c,s){const t=p("RouteLink");return d(),h("div",null,[s[6]||(s[6]=k(`<blockquote><p>Mock éé å¨ä½¿ç¨æå â ç¨äºæä»¶éææµè¯çå åéé å¨ï¼æ éç½ç»è¿æ¥ã</p></blockquote><hr><h2 id="quick-reference" tabindex="-1"><a class="header-anchor" href="#quick-reference"><span>Quick Reference</span></a></h2><table><thead><tr><th>屿§</th><th>å¼</th></tr></thead><tbody><tr><td>éé å¨åç§°</td><td><code>mock</code></td></tr><tr><td>平尿 è¯</td><td><code>mock</code>ï¼å¯èªå®ä¹ï¼</td></tr><tr><td>åè®®</td><td>å 忍¡æ</td></tr><tr><td>ç±»</td><td><code>MockAdapter</code></td></tr><tr><td>å¯¼å ¥</td><td><code>from ncatbot.adapter import MockAdapter</code></td></tr></tbody></table><hr><h2 id="æ¦è¿°" tabindex="-1"><a class="header-anchor" href="#æ¦è¿°"><span>æ¦è¿°</span></a></h2><p>Mock éé å¨ä¸è¿æ¥ä»»ä½å¤é¨æå¡ï¼å®å ¨å¨å åä¸è¿è¡ãå®ç主è¦ç¨éæ¯ï¼</p><ul><li><strong>æä»¶éææµè¯</strong>ï¼æ³¨å ¥æ¨¡æäºä»¶ï¼éªè¯æä»¶è¡ä¸º</li><li><strong>API è°ç¨éªè¯</strong>ï¼è®°å½ææ API è°ç¨ï¼æè¨è°ç¨åæ°å次æ°</li><li><strong>æ ç½ç»å¼å</strong>ï¼ä¸éè¦è¿è¡ NapCat æå ¶ä»å¤é¨æå¡</li></ul><hr><h2 id="åºæ¬ç¨æ³" tabindex="-1"><a class="header-anchor" href="#åºæ¬ç¨æ³"><span>åºæ¬ç¨æ³</span></a></h2><div class="language-python line-numbers-mode" data-ext="python" data-title="python"><button class="copy" title="å¤å¶ä»£ç " data-copied="å·²å¤å¶"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">from</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> ncatbot</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">app </span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> BotClient</span></span> 2<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">from</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> ncatbot</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">adapter </span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> MockAdapter</span></span> 3<span class="line"></span> 4<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">adapter </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> MockAdapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">platform</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">qq</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span></span> 5<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">bot </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> BotClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">adapters</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=[</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">])</span></span> 6<span class="line"></span> 7<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"># å¯å¨åæ³¨å ¥äºä»¶</span></span> 8<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">await</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">inject_event</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">some_event_data</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span></span> 9<span class="line"></span> 10<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"># æ£æ¥ API è°ç¨</span></span> 11<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">assert</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">mock_api</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">called</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">
11send_group_msg</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span></span> 12<span class="line"></span> 13<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"># 忢</span></span> 14<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">stop</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="èªå®ä¹å¹³å°æ è¯" tabindex="-1"><a class="header-anchor" href="#èªå®ä¹å¹³å°æ è¯"><span>èªå®ä¹å¹³å°æ è¯</span></a></h3><p>Mock éé å¨ç <code>platform</code> å¯ä»¥èªå®ä¹ï¼æ¨¡æä¸åå¹³å°çäºä»¶ãMockAdapter 伿 ¹æ®å¹³å°èªå¨éæ©å¯¹åºç Mock API å®ç°ï¼</p><div class="language-python line-numbers-mode" data-ext="python" data-title="python"><button class="copy" title="å¤å¶ä»£ç " data-copied="å·²å¤å¶"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">adapter </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> MockAdapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">platform</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">qq</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"> # â MockBotAPI (IQQAPIClient)</span></span> 15<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">adapter </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> MockAdapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">platform</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">bilibili</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"> # â MockBiliAPI (IBiliAPIClient)</span></span> 16<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">adapter </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> MockAdapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">platform</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">github</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"> # â MockGitHubAPI (IGitHubAPIClient)</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><hr><h2 id="mockapibase-ç»§æ¿ä½ç³»" tabindex="-1"><a class="header-anchor" href="#mockapibase-ç»§æ¿ä½ç³»"><span>MockAPIBase ç»§æ¿ä½ç³»</span></a></h2><p>ææ Mock API å ±äº«åºç±» <code>MockAPIBase</code>
16ï¼æä¾ç»ä¸çè°ç¨å½å¶åæ¥è¯¢åºç¡è®¾æ½ï¼</p><div class="language-text line-numbers-mode" data-ext="text" data-title="text"><button class="copy" title="å¤å¶ä»£ç " data-copied="å·²å¤å¶"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span>MockAPIBase (IAPIClient)</span></span> 17<span class="line"><span>âââ MockBotAPI (IQQAPIClient) â QQ å¹³å°</span></span> 18<span class="line"><span>âââ MockBiliAPI (IBiliAPIClient) â Bilibili å¹³å°</span></span> 19<span class="line"><span>âââ MockGitHubAPI (IGitHubAPIClient) â GitHub å¹³å°</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>æ¯ä¸ªåç±»ç API æ¹æ³ä»¥ <code>self._record("action", key=val, ...)</code> å½¢å¼å½å¶è°ç¨ï¼ææåæ°ä»¥å ³é®åå½¢å¼åå¨å° <code>APICall.params: Dict[str, Any]</code>ã</p><h3 id="è°ç¨è®°å½æ¹æ³-mockapibase-æä¾" tabindex="-1"><a class="header-anchor" href="#è°ç¨è®°å½æ¹æ³-mockapibase-æä¾"><span>è°ç¨è®°å½æ¹æ³ï¼MockAPIBase æä¾ï¼</span></a></h3><table><thead><tr><th>æ¹æ³</th><th>ç¾å</th><th>说æ</th></tr></thead><tbody><tr><td><code>called</code></td><td><code>(action) â bool</code></td><td>æ£æ¥ action æ¯å¦è¢«è°ç¨è¿</td></tr><tr><td><code>call_count</code></td><td><code>(action) â int</code></td><td>è·åè°ç¨æ¬¡æ°</td></tr><tr><td><code>get_calls</code></td><td><code>(action) â List[APICall]</code></td><td>è·åæå® action çææè°ç¨è®°å½</td></tr><tr><td><code>last_call</code></td><td><code>(action=None) â Optional[APICall]</code></td><td>è·åæå䏿¬¡è°ç¨</td></tr><tr><td><code>calls</code></td><td><code>@property â List[APICall]</code></td><td>ææè°ç¨è®°å½</td></tr><tr><td><code>set_response</code></td><td><code>(action, response) â None</code></td><td>为æå® action é¢è®¾è¿åå¼</td></tr><tr><td><code>reset</code></td><td><code>() â None</code></td><td>æ¸ é¤ææè®°å½åé¢è®¾</td></tr></tbody></table><h3 id="apicall-æ°æ®ç±»" tabindex="-1"><a class="header-anchor" href="#apicall-æ°æ®ç±»"><span>APICall æ°æ®ç±»</span></a></h3><div class="language-python line-numbers-mode" data-ext="python" data-title="python"><button class="copy" title="å¤å¶ä»£ç " data-copied="å·²å¤å¶"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">from</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> ncatbot</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">mock</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">api_base </span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> APICall</span></span> 20<span class="line"></span> 21<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">@</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">dataclass</span></span> 22<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> APICall</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">:</span></span> 23<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> action</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">:</span><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> str</span><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"> # API æ¹æ³å</span></span> 24<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> params</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">:</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Dict</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">[</span><span style="--shiki-light:#998418;--shiki-dark:#B8A965;">str</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Any</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">]</span><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"> # ææåæ°æååå¨</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="示ä¾" tabindex="-1"><a class="header-anchor" href="#示ä¾"><span>示ä¾</span></a></h3><div class="language-python line-numbers-mode" data-ext="python" data-title="python"><button class="copy" title="å¤å¶ä»£ç " data-copied="å·²å¤å¶"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"># é¢è®¾ API è¿åå¼</span></span> 25<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">mock_api</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">set_response</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">
25send_group_msg</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">message_id</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">:</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;"> 12345</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">})</span></span> 26<span class="line"></span> 27<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"># 触åæä»¶é»è¾ï¼æ³¨å ¥äºä»¶ï¼</span></span> 28<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">await</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">inject_event</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">event_data</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span></span> 29<span class="line"></span> 30<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"># éªè¯ API 被è°ç¨</span></span> 31<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">assert</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">mock_api</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">called</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">send_group_msg</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span></span> 32<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">assert</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">mock_api</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">call_count</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">send_group_msg</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> ==</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;"> 1</span></span> 33<span class="line"></span> 34<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;"># æ£æ¥è°ç¨åæ°</span></span> 35<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">call </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> adapter</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">mock_api</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">last_call</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">
35send_group_msg</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span></span> 36<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">assert</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> call</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">params</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">[</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">group_id</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">]</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> ==</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> "</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">123456</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><hr><h2 id="ä¸-testharness-çå ³ç³»" tabindex="-1"><a class="header-anchor" href="#ä¸-testharness-çå ³ç³»"><span>ä¸ TestHarness çå ³ç³»</span></a></h2><p><code>TestHarness</code> å <code>PluginTestHarness</code> å é¨ä½¿ç¨ <code>MockAdapter</code>ãå¦æä½ ä½¿ç¨æµè¯æ¡æ¶ï¼é常ä¸éè¦ç´æ¥æä½ <code>MockAdapter</code>ï¼</p><div class="language-python line-numbers-mode" data-ext="python" data-title="python"><button class="copy" title="å¤å¶ä»£ç " data-copied="å·²å¤å¶"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">from</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> ncatbot</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">testing </span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> PluginTestHarness</span></span> 37<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">from</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> ncatbot</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">testing</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">factories</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">qq </span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> group_message</span></span> 38<span class="line"></span> 39<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">async</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> with</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> PluginTestHarness</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span></span> 40<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> plugin_names</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=[</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">hello_world</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">],</span></span> 41<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> plugins_dir</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">Path</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">plugins/</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">),</span></span> 42<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> as</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> h</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">:</span></span> 43<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> await</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> h</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">inject</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">group_message</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">hello</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">))</span></span> 44<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> await</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> h</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">settle</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span></span> 45<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> h</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">assert_api</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">
45send_group_msg</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">"</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">).</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">called</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>ç´æ¥ä½¿ç¨ <code>MockAdapter</code> éåéè¦æ´åºå±æ§å¶çæµè¯åºæ¯ã</p><hr><h2 id="延伸é
读" tabindex="-1"><a class="header-anchor" href="#延伸é
读"><span>延伸é
读</span></a></h2>`,32)),a("ul",null,[a("li",null,[s[1]||(s[1]=i("æä»¶æµè¯æå â ")),n(t,{to:"/notes/guide/9.%20%E6%B5%8B%E8%AF%95%E6%8C%87%E5%8D%97/"},{default:e(()=>s[0]||(s[0]=[i("æµè¯æå")])),_:1})]),a("li",null,[s[3]||(s[3]=i("éé
卿¥å£åèï¼å« MockAdapter APIï¼â ")),n(t,{to:"/notes/reference/7.%20%E9%80%82%E9%85%8D%E5%99%A8/"},{default:e(()=>s[2]||(s[2]=[i("éé
å¨åè")])),_:1})]),a("li",null,[s[5]||(s[5]=i("TestHarness 详解 â ")),n(t,{to:"/notes/guide/9.%20%E6%B5%8B%E8%AF%95%E6%8C%87%E5%8D%97/2.%20%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7.html"},{default:e(()=>s[4]||(s[4]=[i("æµè¯å·¥å
·")])),_:1})])])])}const y=l(r,[["render",o],["__file","index.html.vue"]]),A=JSON.parse('{"path":"/guide/obgl9txz/","title":"Mock éé
å¨","lang":"zh-CN","frontmatter":{"title":"Mock éé
å¨","createTime":"2026/03/19 17:26:45","permalink":"/guide/obgl9txz/","description":"Mock éé
å¨ä½¿ç¨æå â ç¨äºæä»¶éææµè¯çå
åéé
å¨ï¼æ éç½ç»è¿æ¥ã Quick Reference æ¦è¿° Mock éé
å¨ä¸è¿æ¥ä»»ä½å¤é¨æå¡ï¼å®å
¨å¨å
åä¸è¿è¡ãå®ç主è¦ç¨éæ¯ï¼ æä»¶éææµè¯ï¼æ³¨å
¥æ¨¡æäºä»¶ï¼éªè¯æä»¶è¡ä¸º API è°ç¨éªè¯ï¼è®°å½ææ API è°ç¨ï¼æè¨è°ç¨åæ°åæ¬¡æ° æ ç½ç»å¼åï¼ä¸éè¦è¿è¡ NapCat æå
¶ä»å¤é¨æå¡ åºæ¬ç¨æ³ ...","head":[["meta",{"property":"og:url","content":"http://docs.ncatbot.xyz/guide/obgl9txz/"}],["meta",{"property":"og:site_name","content":"NcatBot ææ¡£"}],["meta",{"property":"og:title","content":"Mock éé
å¨"}],["meta",{"property":"og:description","content":"Mock éé
å¨ä½¿ç¨æå â ç¨äºæä»¶éææµè¯çå
åéé
å¨ï¼æ éç½ç»è¿æ¥ã Quick Reference æ¦è¿° Mock éé
å¨ä¸è¿æ¥ä»»ä½å¤é¨æå¡ï¼å®å
¨å¨å
åä¸è¿è¡ãå®ç主è¦ç¨éæ¯ï¼ æä»¶éææµè¯ï¼æ³¨å
¥æ¨¡æäºä»¶ï¼éªè¯æä»¶è¡ä¸º API è°ç¨éªè¯ï¼è®°å½ææ API è°ç¨ï¼æè¨è°ç¨åæ°åæ¬¡æ° æ ç½ç»å¼åï¼ä¸éè¦è¿è¡ NapCat æå
¶ä»å¤é¨æå¡ åºæ¬ç¨æ³ ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2026-04-30T14:41:02.000Z"}],["meta",{"property":"article:modified_time","content":"2026-04-30T14:41:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Mock éé
å¨\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2026-04-30T14:41:02.000Z\\",\\"author\\":[]}"]]},"headers":[],"readingTime":{"minutes":2.23,"words":669},"git":{"updatedTime":1777560062000,"contributors":[{"name":"GEYUANwuqi","username":"GEYUANwuqi","email":"[email protected]","commits":1,"avatar":"https://gravatar.com/avatar/1cf26d82e91dff657f3fa4d4911cdabcf7b76396339e886e69f99b15d4c8c808?d=retro"}]},"autoDesc":true,"filePathRelative":"notes/guide/2. éé
å¨/4. Mock éé
å¨.md"}');export{y as comp,A as data};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.