เยี่ยมชมเว็บไซต์ NSubstitute เพื่อดูข้อมูลเพิ่มเติม
NSubstitute ได้รับการออกแบบมาเพื่อทดแทนไลบรารีจำลอง .NET ที่เป็นมิตร
มันเป็นความพยายามที่จะสนองความอยากห้องสมุดจำลองด้วยไวยากรณ์ที่กระชับซึ่งช่วยให้เรามุ่งเน้นไปที่จุดประสงค์ของการทดสอบมากกว่าการกำหนดค่าของการทดสอบสองเท่าของเรา เราได้พยายามทำให้การดำเนินการที่จำเป็นบ่อยที่สุดชัดเจนและใช้งานง่าย โดยทำให้สถานการณ์ที่ไม่ปกติสามารถค้นพบและเข้าถึงได้ และในขณะเดียวกันก็รักษาภาษาที่เป็นธรรมชาติให้ได้มากที่สุด
เหมาะสำหรับผู้ที่เพิ่งเริ่มทำการทดสอบ และสำหรับคนอื่นๆ ที่ต้องการให้การทดสอบเขียนโดยมีเสียงรบกวนน้อยลงและมีแลมบ์ดาน้อยลง
หากคุณมีคำถาม คำขอคุณลักษณะ หรือข้อเสนอแนะเกี่ยวกับ NSubstitute โปรดแจ้งปัญหาบนเว็บไซต์โครงการของเรา ยินดีต้อนรับทุกคำถามผ่านทางไซต์โครงการของเรา แต่สำหรับคำถามสไตล์ "วิธีการ" คุณสามารถลองใช้ StackOverflow ด้วยแท็ก [nsubstitute] ซึ่งมักจะนำไปสู่คำตอบที่ดีมากจากชุมชนการเขียนโปรแกรมขนาดใหญ่ StackOverflow มีประโยชน์อย่างยิ่งหากคำถามของคุณเกี่ยวข้องกับไลบรารีอื่นๆ ที่ทีมของเราอาจไม่คุ้นเคย (เช่น NSubstitute with Entity Framework)
สมมติว่าเรามีอินเทอร์เฟซเครื่องคิดเลขพื้นฐาน:
public interface ICalculator
{
int Add ( int a , int b ) ;
string Mode { get ; set ; }
event Action PoweringUp ;
}
เราสามารถขอให้ NSubstitute สร้างอินสแตนซ์ทดแทนสำหรับประเภทนี้ได้ เราอาจขอ stub, mock, fake, spy, test double เป็นต้น แต่ทำไมต้องกังวล ในเมื่อเราต้องการทดแทนอินสแตนซ์ที่เราควบคุมได้
_calculator = Substitute . For < ICalculator > ( ) ;
virtual
ของคลาสเท่านั้น ระวังการทดแทนคลาสด้วยสมาชิกที่ไม่ใช่เสมือน ดูการสร้างสิ่งทดแทนสำหรับข้อมูลเพิ่มเติม
ตอนนี้เราสามารถบอกให้ตัวแทนของเราคืนค่าการโทรได้:
_calculator . Add ( 1 , 2 ) . Returns ( 3 ) ;
Assert . That ( _calculator . Add ( 1 , 2 ) , Is . EqualTo ( 3 ) ) ;
เราสามารถตรวจสอบได้ว่าตัวแทนของเรารับสายและไม่รับสายอื่น:
_calculator . Add ( 1 , 2 ) ;
_calculator . Received ( ) . Add ( 1 , 2 ) ;
_calculator . DidNotReceive ( ) . Add ( 5 , 7 ) ;
หากการยืนยันที่ได้รับ () ของเราล้มเหลว NSubstitute จะพยายามให้ความช่วยเหลือแก่เราเกี่ยวกับปัญหาที่อาจเกิดขึ้น:
NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
Add(1, 2)
Actually received no matching calls.
Received 2 non-matching calls (non-matching arguments indicated with '*' characters):
Add(1, *5*)
Add(*4*, *7*)
นอกจากนี้เรายังสามารถทำงานกับคุณสมบัติโดยใช้ไวยากรณ์ Returns ที่เราใช้สำหรับวิธีการ หรือเพียงแค่ยึดติดกับตัวตั้งค่าคุณสมบัติเก่าธรรมดา (สำหรับคุณสมบัติการอ่าน/เขียน):
_calculator . Mode . Returns ( "DEC" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
_calculator . Mode = "HEX" ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
NSubstitute รองรับการจับคู่อาร์กิวเมนต์สำหรับการตั้งค่าส่งคืนและรับการยืนยันการโทร:
_calculator . Add ( 10 , - 5 ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Any < int > ( ) ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Is < int > ( x => x < 0 ) ) ;
เราสามารถใช้การจับคู่อาร์กิวเมนต์รวมทั้งส่งฟังก์ชันไปที่ Returns() เพื่อให้ได้พฤติกรรมเพิ่มเติมจากสิ่งทดแทนของเรา (อาจมากเกินไป แต่นั่นคือสิ่งที่คุณ):
_calculator
. Add ( Arg . Any < int > ( ) , Arg . Any < int > ( ) )
. Returns ( x => ( int ) x [ 0 ] + ( int ) x [ 1 ] ) ;
Assert . That ( _calculator . Add ( 5 , 10 ) , Is . EqualTo ( 15 ) ) ;
Returns() สามารถเรียกใช้ด้วยอาร์กิวเมนต์หลายตัวเพื่อตั้งค่าลำดับของค่าที่ส่งคืน
_calculator . Mode . Returns ( "HEX" , "DEC" , "BIN" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "BIN" ) ) ;
สุดท้ายนี้ เราสามารถแจ้งเหตุการณ์เกี่ยวกับสิ่งทดแทนของเราได้ (น่าเสียดายที่ C# จำกัดขอบเขตอย่างมากในการล้างไวยากรณ์นี้):
bool eventWasRaised = false ;
_calculator . PoweringUp += ( ) => eventWasRaised = true ;
_calculator . PoweringUp += Raise . Event < Action > ( ) ;
Assert . That ( eventWasRaised ) ;
NSubstitute และการทดสอบสามารถคอมไพล์และรันโดยใช้ Visual Studio, Visual Studio Code หรือโปรแกรมแก้ไขอื่น ๆ ที่รองรับ .NET โปรดทราบว่าการทดสอบบางรายการมีการทำเครื่องหมายเป็น [Pending]
และไม่ได้ตั้งใจให้ผ่านในปัจจุบัน ดังนั้นจึงเป็นความคิดที่ดีที่จะแยกการทดสอบในหมวดหมู่รอดำเนินการออกจากการทดสอบ
นอกจากนี้ยังมีสคริปต์บิลด์ในไดเร็กทอรี ./build
สำหรับบิลด์บรรทัดคำสั่ง และการกำหนดค่า CI ในรูทโปรเจ็กต์
หากต้องการสร้างเวอร์ชันเต็ม คุณจะต้องมี Ruby เนื่องจากมีการใช้ jekyll gem เพื่อสร้างเว็บไซต์
@fluffy-spoon/substitute
บน NPM)