การเยาะเย้ยคืออะไร


532

การเยาะเย้ยคืออะไร .


3
นอกจากนี้ยังดูที่นี่stackoverflow.com/questions/3622455/...
น้ำผึ้ง

1
engineering.pivotal.io/post/the-test-double-rule-of-thumbมีภาพรวมแบบกว้างของการทดสอบประเภทต่าง ๆ (รวมถึง mocks) และสิ่งที่คุณควรใช้เมื่อ
carpeliam

คำตอบ:


598

อารัมภบท: หากคุณมองขึ้นเป็นรูปธรรมจำลองในพจนานุกรมคุณจะพบว่าหนึ่งในคำจำกัดความของคำว่าเป็นสิ่งที่ทำเลียนแบบ


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

ในระยะสั้นการเยาะเย้ยคือการสร้างวัตถุที่จำลองพฤติกรรมของวัตถุจริง


บางครั้งคุณอาจต้องการที่จะแยกแยะความแตกต่างระหว่างเยาะเย้ยเมื่อเทียบกับstubbing อาจมีความขัดแย้งบางอย่างเกี่ยวกับเรื่องนี้ แต่คำจำกัดความของต้นขั้วของฉันเป็นวัตถุจำลอง "น้อยที่สุด" สตับใช้พฤติกรรมเพียงพอที่จะอนุญาตให้วัตถุภายใต้การทดสอบดำเนินการทดสอบ

จำลองเหมือนต้นขั้ว แต่การทดสอบจะตรวจสอบว่าวัตถุภายใต้การทดสอบเรียกว่าจำลองตามที่คาดไว้ ส่วนหนึ่งของการทดสอบกำลังตรวจสอบว่ามีการใช้งานจำลองอย่างถูกต้อง

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

หากคุณต้องการตรวจสอบว่าวัตถุภายใต้การทดสอบเขียนข้อมูลเฉพาะบางอย่างไปยังฐานข้อมูลคุณจะต้องจำลองฐานข้อมูล การทดสอบของคุณจะรวมการยืนยันเกี่ยวกับสิ่งที่เขียนไปยังฐานข้อมูลจำลอง


18
นี่คือคำตอบที่ดี แต่มันไม่จำเป็น จำกัด แนวคิดของการเยาะเย้ยกับวัตถุ การแทนที่ "object" ด้วย "unit" จะทำให้เป็นเรื่องทั่วไปมากขึ้น
Rogério

1
ฉันเข้าใจความแตกต่างของต้นขั้วและเยาะเย้ย สิ่งเดียวก็คือว่าถ้าคุณกำลังทดสอบกรณีของคุณกับต้นขั้วและมันผ่านไปแล้วคุณไม่สามารถสรุปได้ว่าคุณกำลังใช้ต้นขั้วด้วยเหตุนี้คุณไม่จำเป็นต้องมีการตรวจสอบ ?
ฮันนี่

91

คำตอบอื่น ๆ อธิบายว่าการเยาะเย้ยคืออะไร ให้ฉันแนะนำคุณผ่านตัวอย่างต่างๆ และเชื่อฉันจริง ๆ แล้วมันง่ายกว่าที่คุณคิด

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

ตัวอย่างง่ายๆ:

class Foo {
    func add (num1: Int, num2: Int) -> Int { // Line A 
        return num1 + num2 // Line B
    }
}

let unit = Foo() // unit under test
assertEqual(unit.add(1,5),6)

อย่างที่คุณเห็นฉันไม่ได้ทดสอบ LineA นั่นคือฉันไม่ได้ตรวจสอบพารามิเตอร์อินพุต ฉันไม่ได้ตรวจสอบเพื่อดูว่า num1, num2 เป็นจำนวนเต็มหรือไม่ ฉันไม่มีข้อกล่าวหาใด ๆ

ฉันแค่ทดสอบเพื่อดูว่า LineB ( การใช้งานของฉัน) ให้ค่าที่เยาะเย้ย1และ5ทำตามที่ฉันคาดไว้หรือไม่

เห็นได้ชัดว่าในคำพูดจริงสิ่งนี้อาจซับซ้อนกว่านี้มาก พารามิเตอร์สามารถเป็นวัตถุที่กำหนดเองเหมือนคน, ที่อยู่, +หรือรายละเอียดการดำเนินงานได้มากกว่าหนึ่งเดียว แต่ตรรกะของการทดสอบจะเหมือนกัน

ตัวอย่างที่ไม่มีการเข้ารหัส:

สมมติว่าคุณกำลังสร้างเครื่องที่ระบุประเภทและยี่ห้อของอุปกรณ์อิเล็กทรอนิกส์เพื่อความปลอดภัยของสนามบิน เครื่องทำสิ่งนี้โดยการประมวลผลสิ่งที่เห็นด้วยกล้อง

ตอนนี้ผู้จัดการของคุณเดินเข้ามาและขอให้คุณทดสอบหน่วย

จากนั้นคุณในฐานะนักพัฒนาซอฟต์แวร์คุณสามารถนำวัตถุจริง 1,000 ชิ้นเช่น MacBook pro, Google Nexus, กล้วย, iPad ฯลฯ มาทดสอบและดูว่ามันใช้งานได้จริงหรือไม่

แต่คุณยังสามารถใช้วัตถุที่เยาะเย้ยเหมือน MacBook Pro ที่ดูคล้าย ๆ กัน (ไม่มีชิ้นส่วนภายในจริง) หรือกล้วยพลาสติกอยู่ข้างหน้า คุณสามารถช่วยตัวเองจากการลงทุนในแล็ปท็อป 1,000 เครื่องและกล้วยเน่าเปื่อย

ประเด็นคือคุณไม่ได้พยายามทดสอบว่ากล้วยปลอมหรือไม่ ไม่ทดสอบว่าแล็ปท็อปของปลอมหรือไม่ สิ่งที่คุณกำลังทำคือการทดสอบว่าเครื่องของคุณเมื่อมันเห็นกล้วยก็จะพูดnot an electronic deviceและสำหรับ MacBook Pro Laptop, Appleก็จะพูดว่า: สำหรับเครื่องผลลัพธ์ของการตรวจจับควรเหมือนกันสำหรับอุปกรณ์อิเล็กทรอนิกส์ปลอม / เยาะเย้ยและอุปกรณ์อิเล็กทรอนิกส์จริง

ตรรกะดังกล่าวข้างต้นนำไปใช้กับการทดสอบหน่วยของรหัสจริงเช่นกัน นั่นคือฟังก์ชั่นควรทำงานแบบเดียวกันกับมูลค่าจริงที่คุณได้รับจากการป้อนข้อมูลจริง (และการโต้ตอบ) หรือเยาะเย้ยค่าที่คุณฉีดระหว่างการทดสอบหน่วย และเช่นเดียวกับที่คุณช่วยตัวเองจากการใช้กล้วยจริงหรือ MacBook ด้วยการทดสอบหน่วย (และการเยาะเย้ย) คุณช่วยตัวเองจากการทำสิ่งที่ทำให้เซิร์ฟเวอร์ของคุณส่งคืนรหัสสถานะ 500, 403, 200 และอื่น ๆ (บังคับให้ทำ เซิร์ฟเวอร์ของคุณให้เรียก 500 ได้ก็ต่อเมื่อเซิร์ฟเวอร์หยุดทำงานในขณะที่ 200 อยู่เมื่อเซิร์ฟเวอร์หยุดทำงานมันยากที่จะเรียกใช้การทดสอบที่เน้นเครือข่าย 100 ครั้งหากคุณต้องรอ 10 วินาทีอย่างต่อเนื่องระหว่างสลับเซิร์ฟเวอร์ขึ้นและลง) ดังนั้นคุณฉีด / จำลองการตอบสนองด้วยรหัสสถานะ 500, 200, 403 ฯลฯ และทดสอบหน่วย / ฟังก์ชั่นของคุณด้วยค่าที่ถูกฉีด / เยาะเย้ย

ตัวอย่างการเข้ารหัส:

สมมติว่าคุณกำลังเขียนแอปพลิเคชัน iOS และมีการโทรผ่านเครือข่ายงานของคุณคือการทดสอบแอปพลิเคชันของคุณ เพื่อทดสอบ / ระบุว่าการโทรผ่านเครือข่ายทำงานตามที่คาดไว้หรือไม่ความรับผิดชอบของคุณ เป็นความรับผิดชอบของอีกฝ่าย (ทีมเซิร์ฟเวอร์) ในการทดสอบ คุณต้องเอานี้ (เครือข่าย) การพึ่งพาและยังยังคงทดสอบรหัสของคุณทั้งหมดที่ผลงานรอบมัน

การเรียกเครือข่ายสามารถส่งคืนรหัสสถานะอื่น 404, 500, 200, 303 ฯลฯ ด้วยการตอบสนอง JSON

แอปของคุณควรใช้งานได้สำหรับทุกคน (ในกรณีที่มีข้อผิดพลาดแอปของคุณควรจะทิ้งข้อผิดพลาดที่คาดไว้) สิ่งที่คุณทำกับการล้อเลียนคือคุณสร้าง 'จินตภาพ - คล้ายกับเครือข่ายจริง' (เช่นรหัส 200 กับไฟล์ JSON) และทดสอบรหัสของคุณโดยไม่ต้อง 'ทำการโทรเครือข่ายจริงและรอการตอบกลับเครือข่าย' คุณ hardcode ด้วยตนเอง / กลับการตอบสนองเครือข่ายสำหรับการตอบสนองเครือข่ายทุกชนิดและดูว่าแอปของคุณทำงานตามที่คุณคาดหวังหรือไม่ (คุณไม่เคยคิด / ทดสอบ 200 ด้วยข้อมูลที่ไม่ถูกต้องเพราะนั่นไม่ใช่ความรับผิดชอบของคุณความรับผิดชอบของคุณคือการทดสอบแอปของคุณด้วย 200 ที่ถูกต้องหรือในกรณีที่ 400, 500 คุณทดสอบว่าแอปของคุณมีข้อผิดพลาดหรือไม่)

การสร้างจินตภาพ - ซึ่งคล้ายกับของจริงเรียกว่าการเยาะเย้ย

ในการทำเช่นนี้คุณไม่สามารถใช้รหัสเดิม (รหัสเดิมของคุณไม่มีคำตอบที่แทรกไว้ล่วงหน้าใช่ไหม) คุณต้องเพิ่มบางสิ่งลงไปฉีด / ใส่ข้อมูลจำลองที่ไม่ต้องการใช้ตามปกติ (หรือเป็นส่วนหนึ่งของชั้นเรียน)

ดังนั้นคุณจึงสร้างอินสแตนซ์ของคลาสดั้งเดิมและเพิ่มอะไรก็ได้ (นี่คือเครือข่าย HTTPResponse, ข้อมูลหรือในกรณีที่เกิดความล้มเหลวคุณจะต้องผ่าน errorString, HTTPResponse ที่ถูกต้อง) ที่คุณต้องการจากนั้นทดสอบคลาสที่ เยาะเย้ย

เรื่องสั้น ๆ สั้น ๆ การเยาะเย้ยคือการลดความซับซ้อนและจำกัดสิ่งที่คุณกำลังทดสอบและทำให้คุณป้อนสิ่งที่เรียนขึ้นอยู่กับ ในตัวอย่างนี้คุณหลีกเลี่ยงการทดสอบเครือข่ายเรียกตัวเองและแทนการทดสอบหรือไม่แอปของคุณทำงานตามที่คุณคาดหวังกับผลการฉีด / การตอบสนองด้วย - เยาะเย้ยชั้นเรียน

คุณจะต้องทดสอบการตอบสนองของเครือข่ายแยกกัน


ตอนนี้คำถามที่ฉันมีอยู่ในใจเสมอคือ: สัญญา / จุดสิ้นสุดและโดยทั่วไปการตอบสนอง JSON ของ API ของฉันได้รับการปรับปรุงอย่างต่อเนื่อง ฉันจะเขียนการทดสอบหน่วยที่คำนึงถึงสิ่งนี้ได้อย่างไร?

ที่ซับซ้อนมากขึ้นเกี่ยวกับเรื่องนี้: รูปแบบการพูดให้ของต้องใช้คีย์ / usernameข้อมูลที่มีชื่อว่า คุณทดสอบและผ่านการทดสอบของคุณ 2 idสัปดาห์ต่อมาเปลี่ยนชื่อแบ็กเอนด์ที่สำคัญในการ การทดสอบของคุณยังคงผ่าน ขวา? หรือไม่?

มันเป็นความรับผิดชอบของนักพัฒนาแบ็กเอนด์ที่จะปรับปรุง mocks มันควรเป็นส่วนหนึ่งของข้อตกลงของเราที่พวกเขาให้ปรับปรุง mocks หรือไม่?

คำตอบของปัญหาข้างต้นคือ: การทดสอบหน่วย + กระบวนการพัฒนาของคุณในฐานะนักพัฒนาฝั่งไคลเอ็นต์ควร / จะได้รับการตอบสนองที่เยาะเย้ยล้าสมัย หากคุณถามฉันได้อย่างไร คำตอบคือ:

แอปจริงของเราจะล้มเหลว (หรือไม่ล้มเหลวยังไม่มีพฤติกรรมที่ต้องการ) โดยไม่ใช้ API ที่อัปเดต ... ดังนั้นหากล้มเหลว ... เราจะทำการเปลี่ยนแปลงรหัสการพัฒนาของเรา ซึ่งนำไปสู่การทดสอบของเราอีกครั้งล้มเหลว .... ซึ่งเราจะต้องแก้ไขให้ถูกต้อง (อันที่จริงถ้าเราต้องทำกระบวนการ TDD อย่างถูกต้องเราจะไม่เขียนโค้ดใด ๆ เกี่ยวกับฟิลด์เว้นแต่ว่าเราจะเขียนแบบทดสอบ ... และดูว่ามันล้มเหลวแล้วไปและเขียนรหัสการพัฒนาจริงสำหรับมัน)

ทั้งหมดนี้หมายความว่าแบ็กเอนด์ไม่จำเป็นต้องพูดว่า: "เฮ้เราอัปเดต mocks" ... ในที่สุดมันก็เกิดขึ้นผ่านการพัฒนา / การดีบักโค้ดของคุณ ‌ّ เพราะมันเป็นส่วนหนึ่งของกระบวนการพัฒนา! แม้ว่าแบ็กเอนด์จะให้คำตอบที่เย้ยหยันสำหรับคุณ แต่ก็ง่ายกว่า

จุดทั้งหมดของฉันคือ (ถ้าคุณไม่สามารถรับการตอบกลับ API ที่เยาะเย้ยโดยอัตโนมัติ) จำเป็นต้องมีการโต้ตอบกับมนุษย์เช่นการอัปเดตด้วยตนเองของ JSONs และมีการประชุมสั้น ๆ เพื่อให้แน่ใจว่าค่าของพวกเขาทันสมัย

ส่วนนี้ถูกเขียนขึ้นเนื่องจากการอภิปรายหย่อนในกลุ่มพบปะสังสรรค์ CocoaHead ของเรา


สำหรับ iOS devs เท่านั้น:

เป็นตัวอย่างที่ดีมากในการเยาะเย้ยนี้พูดคุยพิธีสารเชิงปฏิบัติโดยนาตาชา Muraschev เพียงข้ามไปยังเวลา 18:30 น. แม้ว่าสไลด์อาจจะไม่ซิงค์กับวิดีโอจริง 🤷‍♂️

ฉันชอบส่วนนี้จากการถอดเสียง:

เพราะนี่คือการทดสอบ ... เราไม่ต้องการที่จะทำให้แน่ใจว่าgetฟังก์ชั่นจากGettableที่เรียกว่าเพราะมันสามารถกลับมาและฟังก์ชั่นในทางทฤษฎีสามารถกำหนดอาร์เรย์ของรายการอาหารจากที่ใดก็ได้ เราต้องแน่ใจว่ามันถูกเรียกว่า;


3
ตัวอย่างที่ดีฉันจะเพิ่มว่าในตัวอย่างนี้ subclass ทำหน้าที่เป็นจำลอง แต่ตัวอย่างนี้ยังใช้การขัด การตอบกลับแบบ JSON แบบตายตัวถือว่าเป็นการตอบสนองแบบสตับ ฉันเพิ่มเพียงเพราะมันยากที่จะแยกแยะความแตกต่างระหว่าง mocks และต้นขั้ว แต่ตัวอย่างนี้แสดงให้เห็นชัดเจนว่าทั้งสองสามารถใช้ร่วมกันได้อย่างไร
user3344977

คำอธิบายที่ดีเยี่ยมขอบคุณ ปรับแต่งคำถามเล็กน้อยเกี่ยวกับการเปลี่ยนแปลง API ถ้าไม่ใช่ API ของคุณคุณจึงไม่ได้เป็นส่วนหนึ่งของกระบวนการพัฒนา ฉันต้องการที่จะรู้ว่าเมื่อห้องสมุดลูกค้าของฉันล้มเหลว
ThinkDigital

@ThinkDigital ผู้ให้บริการ API ที่ดีมีบันทึกประจำรุ่นที่ดีและสื่อสารการเปลี่ยนแปลงอย่างถูกต้องหากคุณไม่มีช่องสัญญาณนั้นอาจถึงเวลาที่คุณจะต้องนั่งประชุมและพูดคุยกัน | นักพัฒนาที่ดีจะพิจารณาการเปลี่ยนแปลง API ของเวอร์ชันใหม่เสมอและหลีกเลี่ยงเพียงแค่อัปเกรดเวอร์ชัน API คุณมีเวอร์ชัน API หรือไม่ หากไม่มีใครจับได้คุณจะได้รับคำตอบจาก QAing ให้อัพเดทการทดสอบของคุณ←หน้าที่ของทีมทั้งหมด →หน้าที่ dev เดียว: ไม่ควรสนใจมาก เพียงจัดการกรณีที่เซิร์ฟเวอร์ส่งคืนข้อผิดพลาดหรือเซิร์ฟเวอร์ไม่ส่งคืนข้อผิดพลาด แต่ไม่สามารถแยกวิเคราะห์ json หรือจัดการกรณีและปัญหาที่ถูกต้อง
ฮันนี่

ขอบคุณที่ตอบกลับ @Honey! ในกรณีของฉันฉันกำลังรักษาลูกค้าไว้สำหรับpub.devซึ่งมี API แต่ขาดไปอย่างรุนแรง มันดีกว่าที่จะสร้าง API โดยการขูดไซต์ของพวกเขามากกว่าใช้ API อย่างเป็นทางการ ด้วยเหตุนี้การเปลี่ยนแปลงที่เกิดขึ้นกับเว็บไซต์จึงอาจทำให้รหัสเสียหายและพวกเขาก็ไม่จำเป็นต้องไปอัปเดตใครก็ตามในกรณีนี้ ไซต์ดังกล่าวเป็นโอเพ่นซอร์ส แต่เป็นสิ่งที่แตกต่างจากการบำรุงรักษา API ที่เกิดจากการเปลี่ยนแปลงที่เกิดขึ้นเล็กน้อย
ThinkDigital

32

มีคำตอบมากมายเกี่ยวกับ SO และโพสต์ที่ดีบนเว็บเกี่ยวกับการเยาะเย้ย ที่เดียวที่คุณอาจต้องการเริ่มค้นหาคือโพสต์โดย Martin Fowler Mocks Ar ไม่ใช่ Stubsที่เขาพูดถึงแนวคิดการเยาะเย้ย

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


คำถามเดิมของคุณพูดถึง TypeMock ดังนั้นฉันจึงทิ้งคำตอบไว้ด้านล่าง

TypeMock เป็นชื่อของที่กรอบเยาะเย้ยในเชิงพาณิชย์

มันมีคุณสมบัติทั้งหมดของกรอบการเยาะเย้ยฟรีเช่น RhinoMocks และ Moq รวมทั้งตัวเลือกที่มีประสิทธิภาพมากขึ้น

ไม่ว่าคุณจะต้องการ TypeMock หรือไม่ก็เป็นที่ถกเถียงกันอย่างมาก - คุณสามารถทำการเยาะเย้ยส่วนใหญ่ที่คุณต้องการด้วยการเยาะเย้ยห้องสมุดฟรีและหลายคนแย้งว่าความสามารถที่นำเสนอโดย TypeMock มักจะนำคุณออกจากการออกแบบ

เป็นคำตอบอื่นที่ระบุว่า 'TypeMocking' ไม่ใช่แนวคิดที่กำหนดไว้จริง แต่สามารถนำมาใช้เพื่อหมายถึงประเภทของการเยาะเย้ยที่ TypeMock เสนอให้โดยใช้ตัวสร้างโปรไฟล์ CLR เพื่อสกัดกั้นการเรียก. Net ณ รันไทม์ เช่นต้องการอินเตอร์เฟสหรือวิธีเสมือน)


@Masoud ไม่เคยพูดถึง TypeMock คำถามของเขาเกี่ยวกับ "การเยาะเย้ยประเภท" โดยทั่วไป
Peter Lillevold

4
@ Peter - เป็นความคิดเห็นอีกอย่างหนึ่งให้ตรวจสอบประวัติการแก้ไขของคำถาม ไม่มากที่ฉันสามารถทำได้ถ้าฉันโพสต์คำตอบแล้วคำถามเดิมจะเปลี่ยนไปโดยสิ้นเชิง
David Hall

9

จำลองเป็นวิธี / วัตถุที่จำลองพฤติกรรมของวิธีการ / วัตถุจริงในรูปแบบการควบคุม วัตถุจำลองใช้ในการทดสอบหน่วย

บ่อยครั้งที่วิธีการทดสอบเรียกบริการภายนอกอื่น ๆ หรือวิธีการภายใน สิ่งเหล่านี้เรียกว่าการพึ่งพา เมื่อการเยาะเย้ยการพึ่งพาอาศัยกันทำงานในลักษณะที่เรากำหนดไว้

ด้วยการอ้างอิงที่ถูกควบคุมโดย mocks เราสามารถทดสอบพฤติกรรมของวิธีการที่เราเข้ารหัสได้อย่างง่ายดาย นี่คือการทดสอบหน่วย

วัตถุประสงค์ของการจำลองวัตถุคืออะไร?

Mocks เทียบกับต้นขั้ว

การทดสอบหน่วยเทียบกับการทดสอบการใช้งาน


7

การเยาะเย้ยคือการสร้างวัตถุหลอกที่จำลองพฤติกรรมวัตถุจริงสำหรับการทดสอบ


5

วัตถุประสงค์ของการเยาะเย้ยประเภทคือการแยกการอ้างอิงเพื่อแยกการทดสอบไปยังหน่วยที่เฉพาะเจาะจง ต้นขั้วเป็นตัวแทนง่าย ๆ ในขณะที่ mocks เป็นตัวแทนที่สามารถตรวจสอบการใช้งาน กรอบการเยาะเย้ยเป็นเครื่องมือที่จะช่วยให้คุณสร้างสตับและ mocks

แก้ไข : เนื่องจากถ้อยคำต้นฉบับกล่าวถึง "การพิมพ์ดีด" ฉันรู้สึกว่านี่เกี่ยวข้องกับ TypeMock จากประสบการณ์ของฉันคำทั่วไปคือ "เยาะเย้ย" โปรดอย่าสนใจข้อมูลด้านล่างโดยเฉพาะบน TypeMock

TypeMock Isolator แตกต่างจากกรอบการเยาะเย้ยอื่น ๆ ส่วนใหญ่ซึ่งมันทำงานแก้ไข IL ของฉันได้ทันที ที่ช่วยให้มันจำลองประเภทและอินสแตนซ์ที่กรอบอื่น ๆ ส่วนใหญ่ไม่สามารถเยาะเย้ย ในการจำลองประเภท / อินสแตนซ์เหล่านี้ด้วยเฟรมเวิร์กอื่นคุณต้องจัดเตรียม abstractions ของคุณเองและจำลองเหล่านี้

TypeMock มอบความยืดหยุ่นที่ดีเยี่ยมโดยเสียค่าใช้จ่ายในสภาพแวดล้อมรันไทม์ที่สะอาด ในฐานะที่เป็นผลข้างเคียงของวิธีการที่ TypeMock ได้รับผลลัพธ์บางครั้งคุณจะได้รับผลลัพธ์ที่แปลกมากเมื่อใช้ TypeMock


@Masoud ไม่เคยพูดถึง TypeMock คำถามของเขาเกี่ยวกับ "การเยาะเย้ยประเภท" โดยทั่วไป
Peter Lillevold

1
@ ปีเตอร์: ถ้อยคำดั้งเดิมคือ "การเยาะเย้ยประเภทคืออะไร"
Brian Rasmussen

ฉันรู้ว่า. เนื่องจาก "การเยาะเย้ยประเภท" ไม่เท่ากับ "TypeMock" ฉันจึงพบว่าทั้งคุณและ @Oded ตอบค่อนข้างปิดเครื่องหมาย
Peter Lillevold

1
@ Peter: จากประสบการณ์ของฉันคำทั่วไปคือ "การเยาะเย้ย" แต่ในกรณีใด ๆ ฉันได้อัปเดตคำตอบของฉันเพื่อหวังว่าจะทำให้ชัดเจน ขอบคุณสำหรับการป้อนข้อมูล
Brian Rasmussen

3

ฉันคิดว่าการใช้กรอบการเยาะเย้ย TypeMock Isolator จะ TypeMocking

มันเป็นเครื่องมือที่สร้าง mocks สำหรับใช้ในการทดสอบหน่วยโดยไม่จำเป็นต้องเขียนโค้ดของคุณด้วย IoC ในใจ


@Masoud ไม่เคยพูดถึง TypeMock คำถามของเขาเกี่ยวกับ "การเยาะเย้ยประเภท" โดยทั่วไป
Peter Lillevold

3
จริงๆแล้วคำถามเดิมนั้นรวมคำว่า "Type" ไว้ก่อนหน้า "Mocking" แต่มันถูกแก้ไขในภายหลัง นั่นคือเหตุผลที่คำตอบบางคำมีข้อมูลเฉพาะเกี่ยวกับ TypeMock
Martin Liversage

1

หากการเยาะเย้ยของคุณเกี่ยวข้องกับการร้องขอเครือข่ายอีกทางเลือกหนึ่งคือการให้เซิร์ฟเวอร์ทดสอบจริงที่จะตี คุณสามารถใช้บริการนี้เพื่อสร้างคำขอและตอบกลับสำหรับการทดสอบของคุณ http://testerurl.com/


ฉันพยายามเข้าใช้และใช้เวลาหลายนาที ใครจะบอกว่ามันไม่ได้เป็นคำขอเข้าสู่ระบบด้วยเช่นกัน? สุดท้ายนี้อาจจะดีกว่าเป็นความคิดเห็น :)
Kieren ห์นสโตน

จริง ๆ แล้วฉันเอามันลงเพราะฉันไม่รู้สึกอยากย้ายไปที่โฮสติ้งฟรี ใช่สิ่งนี้ควรเป็นความคิดเห็น มันเป็นโอเพนซอร์สดังนั้นหากมีข้อกังวลเกี่ยวกับคำขอบันทึกคุณสามารถเรียกใช้ของคุณเอง github.com/captainchung/TesterUrl
Matthew Chung
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.