[英]How to write Nunit TestCases to test the correct List of strings is returned
我有一個類似的方法:
public virtual IList<string> Validate()
{
...
}
我想使用NUnit對它進行單元測試。 這是車輛類的一部分。
Vehicle
可以是不同類型,即。 Car
Boat
Truck
等。
在我的TestFixture
的頂部,我設置了VehicleTypes
:
private VehicleType[] _vehicleTypes;
[SetUp]
public void MyTestInitialize()
{
transScope = new TransactionScope();
var boat= new VehicleType { Name = "boat" };
var car = new VehicleType { Name = "car" };
var truck = new VehicleType { Name = "truck" };
_vehicleTypes= new VehicleType[] { boat, car, truck };
...
}
我想要的是測試僅從船的方法發送回錯誤消息。
我的單元測試如下:
[TestCase(0, "This vehicle is inappropriate because it doesn't have wheels")]
[TestCase(1, null)]
[TestCase(2, null)]
public void Validate_Vehicle_ReturnsAppropriateErrorMessage(int vehicleType, string expectedResult)
{
var vehicle = new Vehicle { VehicleType = _vehicleTypes[vehicleType] };
var results = vehicle.Validate();
string result;
if (results.Count == 0)
result = null;
else
result = results[0];
Assert.IsTrue(expectedResult == result);
}
因此,這就是我嘗試使用TestCases對其進行測試的方式。 但是我不確定這是正確的方法,因為單元測試中不應包含ifs
嗎?
也許這是為不同類型編寫測試的怪異方法嗎?
有人有更好的建議嗎?
我將這些分解為多個測試。 通過這樣做,您可以編寫一個測試正常行為(非乘船)以及乘船的程序。 如果將來這些測試中的任何一個失敗,您將不必嘗試找出數據驅動測試的哪個迭代失敗。 測試將說明一切。
在這種情況下,我將為船的行為寫一個,為非船的行為寫一個。 其他迭代沒什么意義(並且使用與其他非實驗性驗證相同的代碼路徑進行驗證)
public void Validate_VehicleIsBoat_ReturnsAppropriateErrorMessage()
{
string expectedResult = "This vehicle is inappropriate because it doesn't have wheels";
var vehicle = new Vehicle { VehicleType = VehicleType.Boat }; //or whatever it is in your enum
var results = vehicle.Validate();
Assert.AreEqual( expectedResult, results[0] );
}
public void Validate_VehicleIsNotBoat_DoesNotReturnErrorMessage()
{
var vehicle = new Vehicle { VehicleType = VehicleType.Car }; //or whatever it is in your enum
var results = vehicle.Validate();
Assert.IsNull( results ); // or whatever the no error message case is. Will results[0] have an empty string?
}
您可以添加其他測試以驗證結果集是否也具有所需的所有數據。
無論如何,希望這會有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.