ตกลง ความท้าทายอย่างหนึ่งที่เหลืออยู่คือเราควรจัดการกับ DI เมื่อเราทำ TDD อย่างไร

นั่นเป็นความท้าทายจริงๆ หรืออะไร? เมื่อเราทดสอบ Fragment/Activity ของเรา เราอาจไม่สามารถเข้าถึงแหล่งข้อมูลของเราได้ เนื่องจากเป็น Retrofit และ Room และ … เราสามารถมีห้องในหน่วยความจำได้ แต่บริการเว็บล่ะ

ดังที่ฉันรู้ว่าเราสามารถมีแนวทางที่แตกต่างกันในการจัดการปัญหานี้ได้:

  1. ใช้ Mock Web Service เพื่อจำลองการเชื่อมต่อเครือข่ายและผ่านการปรับปรุงเพิ่มเติมที่เหมาะสม
  2. ถอนการติดตั้ง Reposotry หรือ UseCase DI และติดตั้ง Repository ปลอมลงในส่วน/กิจกรรมของคุณ

ฉันต้องการทำแนวทางที่สอง สมมติว่าคุณมีการออกแบบนี้:

สำหรับการทดสอบ UI เราไม่ควรเชื่อมต่อกับ API จริง และเราต้องปลอมส่วนหนึ่งของโค้ดของเรา แต่ส่วนไหนดีกว่ากัน ฉันคิดว่าตัวเลือกที่ดีที่สุดคือ Repository เพื่อให้เรามี:

แต่ปัญหาอยู่ที่ไหน? ปัญหาคือคุณอาจใช้ DI และในกรณีนี้คือ Hilt ดังนั้นคุณจึงตั้งค่าการฉีดสำหรับ UseCase ของคุณเพื่อฉีด Repository และหากคุณสร้างแอปของคุณบนสถาปัตยกรรมที่เหมาะสม คุณต้องมีอินเทอร์เฟซสำหรับที่เก็บของคุณและส่งผ่านไปยัง UseCase แทน การฝังพื้นที่เก็บข้อมูลนั้น (ตามหลักการ SOLID) และเมื่อคุณพยายามสร้างการทดสอบ UI Hilt จะแทรกการใช้งานของคุณไปที่ UseCase แทนที่จะเป็น FakeRepository คุณต้องถอนการติดตั้ง DI เฉพาะนั้นและสร้าง DI อื่น แต่อย่างไร

ก่อนอื่นมาตรวจสอบก่อนว่าเราต้องการไลบรารีอะไร:

ตกลง ลองดูโค้ดแล้วฉันจะอธิบายส่วนที่เหลือ:

ก่อนอื่น ลองคิดดูว่าเรามีโมดูลสำหรับจัดเตรียม use-case แบบนี้:

ปัญหาของเราคือเมื่อเราเรียกใช้การทดสอบ UI เราไม่มีอินเทอร์เน็ตและวัตถุทั้งหมดควรเป็นของปลอมหรือล้อเลียนหรืออะไรก็ตาม! ดังนั้นเราจึงต้องการพื้นที่เก็บข้อมูลที่เหมาะสม ในกรณีนี้ หากคุณใช้ clean-arch สำหรับโปรเจ็กต์ของคุณ คุณควรมีคลาส SomeRepository และคลาส SomeRepositoryImp และเราไม่ต้องการ SomeRepositoryImp ในการทดสอบ UI ของเรา แทนที่จะเราต้องการ SomeRepositoryFake ! ดังนั้นเราต้องแทนที่ SomeUseCaseModule ในโฟลเดอร์ทดสอบของเรา เราสามารถทำสิ่งนี้ได้:

ง่ายจริงๆ ! ในโค้ดนี้ซึ่งมีอยู่ในโฟลเดอร์ทดสอบของเรา เราได้แทนที่โมดูล SomeUseCase ของเราด้วยเวอร์ชันใหม่ (ฉันทำไปแล้ว แต่คุณสามารถแทนที่ RepositoryModule ของคุณแทนได้เช่นกัน)

มีปัญหาอื่นๆ เช่นกัน อย่างที่คุณเห็นว่าเราอยู่ในการทดสอบ ไม่ใช่โค้ดจริง ดังนั้นเราจึงจำเป็นต้องเปลี่ยนกราฟการพึ่งพาของเรา เราต้องการกิจกรรมอื่นและแอปพลิเคชันอื่น และเราไม่ต้องการกิจกรรมหรือแอปพลิเคชันจริงของเรา

ในขั้นตอนแรก เราต้องการกิจกรรมอื่น คุณสามารถใส่สิ่งนี้ลงในโฟลเดอร์ debug หรือโฟลเดอร์ทดสอบ (ฉันเห็นคนส่วนใหญ่สร้างโฟลเดอร์ debug ข้างโฟลเดอร์หลักและโฟลเดอร์ทดสอบและใส่โค้ดนี้ไว้ที่นั่น):

และคุณต้องมีรายการสำหรับกิจกรรมนี้ด้วย เช่น:

ตอนนี้ลองคิดดูว่าเราต้องการทดสอบ Fragment บนไลบรารีทดสอบ Android คุณสามารถมีบางอย่างชื่อ Scenario คุณสามารถเรียกใช้ Activity Scenario หรือ Fragment Scenario ได้ แต่วิธีการนี้ใช้ไม่ได้กับด้ามจับ เราจำเป็นต้องปรับแต่งสิ่งนั้น ดังนั้นเราจึงสามารถมีส่วนขยายดังนี้:

โค้ดนี้จะเปิดตัว Scenario ของ HiltAndroidActivityTest และแนบส่วนย่อยเข้าไป นี่คือโค้ดทั่วไปที่คุณจะพบได้ในทุกบทความ!

ที่เหลือคือการเปลี่ยนคลาส Application จริงของคุณด้วย HiltTestApplication ซึ่งจัดทำโดย hilt Library มาดูการทดสอบ UI กัน:

ที่นี่ฉันใช้ Robolectric ซึ่งเป็นไลบรารีสำหรับการทดสอบ UI ข้อดีของไลบรารีนี้คือ: คุณสามารถใส่การทดสอบ UI ของคุณลงในโฟลเดอร์ทดสอบแทน androidTest ได้ ดังนั้นคุณจะไม่ต้องใช้อุปกรณ์หรือโปรแกรมจำลองอีกต่อไป อย่างที่คุณเห็นฉัน ใส่การกำหนดค่าบางอย่างเช่นเวอร์ชัน SDK และอื่น ๆ แต่สิ่งสำคัญคือแอปพลิเคชันนั้น ฉันผ่านประเภท HiltTestApplication แล้ว ดังนั้นการทดสอบจะสร้างกราฟการพึ่งพาอื่น คุณต้องเพิ่ม HiltAndroidRule เป็นกฎเพื่อให้ Hilt สามารถจัดเตรียมการพึ่งพาของคุณในการทดสอบ .

และตอนนี้คุณสามารถทดสอบส่วนของคุณและมีความสุขได้แล้ว :)

ปัญหาใด ๆ =› ติดต่อฉัน: [email protected]