ฉันเริ่มเขียนการทดสอบหน่วยสำหรับโครงการปัจจุบันของฉัน ฉันไม่ได้มีประสบการณ์กับมันจริงๆ ฉันต้องการ "รับ" อย่างสมบูรณ์ดังนั้นฉันจึงไม่ใช้เฟรมเวิร์ก IoC หรือไลบรารีที่เยาะเย้ย
ฉันสงสัยว่ามีอะไรผิดปกติหรือเปล่ากับการให้อาร์กิวเมนต์ที่เป็นโมฆะแก่ตัวสร้างวัตถุในการทดสอบหน่วย ให้ฉันให้รหัสตัวอย่าง:
public class CarRadio
{...}
public class Motor
{
public void SetSpeed(float speed){...}
}
public class Car
{
public Car(CarRadio carRadio, Motor motor){...}
}
public class SpeedLimit
{
public bool IsViolatedBy(Car car){...}
}
แต่อีกตัวอย่างรหัสรถยนต์ (TM) ได้ลดเหลือเพียงบางส่วนที่สำคัญสำหรับคำถาม ตอนนี้ฉันเขียนการทดสอบแบบนี้:
public class SpeedLimitTest
{
public void TestSpeedLimit()
{
Motor motor = new Motor();
motor.SetSpeed(10f);
Car car = new Car(null, motor);
SpeedLimit speedLimit = new SpeedLimit();
Assert.IsTrue(speedLimit.IsViolatedBy(car));
}
}
การทดสอบทำงานได้ดี SpeedLimit
ต้องการ a Car
ด้วยMotor
เพื่อทำสิ่งนั้น มันไม่ได้สนใจCarRadio
เลยดังนั้นฉันจึงให้ null สำหรับสิ่งนั้น
ฉันสงสัยว่าวัตถุที่มีฟังก์ชั่นการทำงานที่ถูกต้องโดยไม่ถูกสร้างขึ้นอย่างสมบูรณ์เป็นการละเมิด SRP หรือกลิ่นรหัส ฉันมีความรู้สึกที่ดุด่าเช่นนี้ แต่speedLimit.IsViolatedBy(motor)
ก็ไม่รู้สึกถูกต้องเช่นกัน - การ จำกัด ความเร็วถูกละเมิดโดยรถยนต์ไม่ใช่มอเตอร์ บางทีฉันอาจต้องการมุมมองที่แตกต่างกันสำหรับการทดสอบหน่วยเทียบกับรหัสการทำงานเพราะความตั้งใจทั้งหมดคือการทดสอบเพียงบางส่วนเท่านั้น
การสร้างวัตถุที่มีค่า Null ในหน่วยทดสอบกลิ่นของรหัสหรือไม่?
null
วิทยุแล้วการ จำกัด ความเร็วจะคำนวณอย่างถูกต้อง ตอนนี้คุณอาจต้องการสร้างการทดสอบเพื่อตรวจสอบการ จำกัด ความเร็วด้วยวิทยุ ในกรณีที่พฤติกรรมแตกต่าง ...
Motor
อาจไม่ควรมีspeed
เลย มันควรจะมีthrottle
และคำนวณtorque
ขึ้นอยู่กับปัจจุบันและrpm
throttle
มันเป็นหน้าที่ของรถที่จะใช้ aTransmission
เพื่อรวมเข้ากับความเร็วปัจจุบันและเพื่อเปลี่ยนเป็นrpm
สัญญาณกลับไปที่Motor
... แต่ฉันเดาว่าคุณไม่ได้อยู่ในความเป็นจริงแล้วใช่ไหม?