<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>أسئلة وأجوبة on تعلّم Go بالاختبارات</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/</link><description>Recent content in أسئلة وأجوبة on تعلّم Go بالاختبارات</description><generator>Hugo</generator><language>ar</language><atom:link href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/index.xml" rel="self" type="application/rss+xml"/><item><title>تنفيذ أوامر النظام (OS Exec)</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/os-exec/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/os-exec/</guid><description>&lt;h1 id="تنفيذ-أوامر-النظام-os-exec"&gt;تنفيذ أوامر النظام (OS Exec)&lt;a class="anchor" href="#%d8%aa%d9%86%d9%81%d9%8a%d8%b0-%d8%a3%d9%88%d8%a7%d9%85%d8%b1-%d8%a7%d9%84%d9%86%d8%b8%d8%a7%d9%85-os-exec"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/q-and-a/os-exec"&gt;يمكنك العثور على كل الكود هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;يسأل &lt;a href="https://www.reddit.com/user/keith6014"&gt;keith6014&lt;/a&gt; على &lt;a href="https://www.reddit.com/r/golang/comments/aaz8ji/testdata_and_function_setup_help/"&gt;reddit&lt;/a&gt;&lt;/p&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;أُنفّذ أمرًا باستخدام os/exec.Command() يُنتج بيانات XML. وسيُنفَّذ هذا الأمر داخل دالة اسمها GetData().&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;blockquote class=''&gt;&#10;&lt;p&gt;ولكي أختبر GetData()، لديّ بعض بيانات الاختبار (testdata) التي أنشأتها.&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;blockquote class=''&gt;&#10;&lt;p&gt;في ملف _test.go لديّ TestGetData يستدعي GetData()، لكنه سيستخدم os.exec، وأريد بدلًا من ذلك أن يستخدم بيانات اختباري.&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;blockquote class=''&gt;&#10;&lt;p&gt;فما الطريقة الجيدة لتحقيق ذلك؟ هل ينبغي عند استدعاء GetData أن يكون لديّ وضع &amp;ldquo;test&amp;rdquo; بعلامة ما ليقرأ ملفًا، مثل GetData(mode string)؟&lt;/p&gt;</description></item><item><title>أنواع الأخطاء</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/error-types/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/error-types/</guid><description>&lt;h1 id="أنواع-الأخطاء"&gt;أنواع الأخطاء&lt;a class="anchor" href="#%d8%a3%d9%86%d9%88%d8%a7%d8%b9-%d8%a7%d9%84%d8%a3%d8%ae%d8%b7%d8%a7%d8%a1"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/q-and-a/error-types"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;إنشاء أنواع خاصة بك للأخطاء يمكن أن يكون طريقة أنيقة لترتيب كودك، وتجعل كودك أسهل استخدامًا واختبارًا.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;يسأل Pedro على Gopher Slack&lt;/p&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;إذا كنت أنشئ خطأ مثل &lt;code&gt;fmt.Errorf(&amp;quot;%s must be foo, got %s&amp;quot;, bar, baz)&lt;/code&gt;، فهل هناك طريقة لاختبار التساوي دون مقارنة قيمة النص؟&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;لنصنع دالة تساعدنا على استكشاف هذه الفكرة.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// DumbGetter will get the string body of url if it gets a 200&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;DumbGetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;problem fetching from %s, %v&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StatusCode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StatusOK&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;did not get 200 from %s, got %d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StatusCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// ignoring err for brevity&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ليس نادرًا أن تكتب دالة قد تفشل لأسباب مختلفة، ونريد أن نتأكد أننا نتعامل مع كل سيناريو بشكل صحيح.&lt;/p&gt;</description></item><item><title>قارئ يراعي الـ Context</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/context-aware-reader/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/context-aware-reader/</guid><description>&lt;h1 id="قارئ-يراعي-الـ-context"&gt;قارئ يراعي الـ Context&lt;a class="anchor" href="#%d9%82%d8%a7%d8%b1%d8%a6-%d9%8a%d8%b1%d8%a7%d8%b9%d9%8a-%d8%a7%d9%84%d9%80-context"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/q-and-a/context-aware-reader"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;يوضح هذا الفصل كيف نطوّر بالاختبار أولًا &lt;code&gt;io.Reader&lt;/code&gt; يراعي الـ context، كما كتبه Mat Ryer وDavid Hernandez في &lt;a href="https://pace.dev/blog/2020/02/03/context-aware-ioreader-for-golang-by-mat-ryer"&gt;مدونة The Pace Dev&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="قارئ-يراعي-الـ-context-1"&gt;قارئ يراعي الـ context؟&lt;a class="anchor" href="#%d9%82%d8%a7%d8%b1%d8%a6-%d9%8a%d8%b1%d8%a7%d8%b9%d9%8a-%d8%a7%d9%84%d9%80-context-1"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;أولًا، مقدمة سريعة عن &lt;code&gt;io.Reader&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;إذا كنت قد قرأت فصولًا أخرى في هذا الكتاب فستكون قد صادفت &lt;code&gt;io.Reader&lt;/code&gt; عند فتح الملفات وترميز JSON ومهام شائعة أخرى متنوعة. إنه تجريد بسيط لقراءة البيانات من &lt;em&gt;شيء ما&lt;/em&gt;&lt;/p&gt;</description></item><item><title>إعادة زيارة معالجات HTTP</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/http-handlers-revisited/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/questions-and-answers/http-handlers-revisited/</guid><description>&lt;h1 id="إعادة-زيارة-معالجات-http"&gt;إعادة زيارة معالجات HTTP&lt;a class="anchor" href="#%d8%a5%d8%b9%d8%a7%d8%af%d8%a9-%d8%b2%d9%8a%d8%a7%d8%b1%d8%a9-%d9%85%d8%b9%d8%a7%d9%84%d8%ac%d8%a7%d8%aa-http"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/q-and-a/http-handlers-revisited"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;يحتوي هذا الكتاب بالفعل على فصل عن &lt;a href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/build-an-application/http-server/"&gt;اختبار معالج HTTP&lt;/a&gt;، لكن هذا الفصل سيقدّم نقاشًا أوسع حول تصميم المعالجات، ليكون اختبارها بسيطًا.&lt;/p&gt;&#10;&lt;p&gt;سنلقي نظرة على مثال واقعي، وكيف يمكننا تحسين طريقة تصميمه بتطبيق مبادئ مثل مبدأ المسؤولية الواحدة (single responsibility principle) وفصل الاهتمامات (separation of concerns). ويمكن تحقيق هذه المبادئ باستخدام &lt;a href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/structs-methods-and-interfaces/"&gt;الواجهات (interfaces)&lt;/a&gt; و&lt;a href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/dependency-injection/"&gt;حقن الاعتماديات (dependency injection)&lt;/a&gt;. وبهذا سنوضح أن اختبار المعالجات أمر بسيط للغاية في الحقيقة.&lt;/p&gt;</description></item></channel></rss>