Tôi bắt đầu viết một số bài kiểm tra đơn vị cho dự án hiện tại của tôi. Tôi thực sự không có kinh nghiệm với nó mặc dù. Trước tiên tôi muốn hoàn toàn "hiểu", vì vậy hiện tại tôi không sử dụng khung IoC của mình cũng như thư viện chế giễu.
Tôi đã tự hỏi nếu có bất cứ điều gì sai khi cung cấp các đối số null cho các hàm tạo của các đối tượng trong các thử nghiệm đơn vị. Hãy để tôi cung cấp một số mã ví dụ:
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){...}
}
Một ví dụ về mã xe khác (TM), chỉ còn những phần quan trọng đối với câu hỏi. Bây giờ tôi đã viết một bài kiểm tra như thế này:
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));
}
}
Bài kiểm tra chạy tốt. SpeedLimit
cần một Car
với một Motor
để làm điều của nó. Nó không quan tâm đến một CarRadio
chút nào, vì vậy tôi đã cung cấp null cho điều đó.
Tôi tự hỏi nếu một đối tượng cung cấp chức năng chính xác mà không được xây dựng đầy đủ là vi phạm SRP hoặc mùi mã. Tôi có cảm giác dai dẳng như vậy, nhưng speedLimit.IsViolatedBy(motor)
cũng không cảm thấy đúng - giới hạn tốc độ bị vi phạm bởi ô tô chứ không phải xe máy. Có lẽ tôi chỉ cần một quan điểm khác cho các bài kiểm tra đơn vị so với mã làm việc, bởi vì toàn bộ ý định là chỉ kiểm tra một phần của toàn bộ.
Là xây dựng các đối tượng với null trong đơn vị kiểm tra một mùi mã?
null
đài phát thanh, giới hạn tốc độ được tính toán chính xác. Bây giờ bạn có thể muốn tạo một bài kiểm tra để xác nhận giới hạn tốc độ bằng radio; chỉ trong trường hợp hành vi khác đi ...
Motor
có lẽ không nên có mộtspeed
chút nào. Nó nên có mộtthrottle
và tính toántorque
dựa trên hiện tạirpm
vàthrottle
. Đó là công việc của chiếc xe là sử dụngTransmission
để tích hợp tốc độ đó vào tốc độ hiện tại và biến nó thànhrpm
tín hiệu trở lạiMotor
... Nhưng tôi đoán, dù sao bạn cũng không ở trong đó vì chủ nghĩa hiện thực, phải không?