Witam Jestem nowy w Moq framework i mam kilka pytań na temat tego, jak go używać. Dam przykład i mam nadzieję na odpowiedzi.Jak używać Moq w teście jednostkowym, który wywołuje inną metodę w tej samej klasie?
mam dwie klasy, interfejs i i realizacja:
public class Vehicle{
public string RegistrationNumber {get; set;}
public long VehicleIdentifier { get; set; }
public Tyre TyreSpecification { get; set; }
}
public class Tyre {
public long NumberOfTyres {get; set;}
public long TyreSize { get; set;}
}
public interface ISelecter {
Vehicle GetVehicleByRegistrationNumber(string registrationNumber);
Tyre GetTyreSpecification(long vehicleIdentifier);
}
public class Selecter : ISelecter
{
public Vehicle GetVehicleByRegistrationNumber(string registrationNumber)
{
var vehicle = 'Database will give us the vehicle specification';
//Then we do things with the vehicle object
//Get the tyre specification
vehicle.TyreSpecification = GetTyreSpecification(vehicle.VehicleIdentifier);
return vehicle;
}
public Tyre GetTyreSpecification(long vehicleIdentifier)
{
var tyre = 'external manufacture system gets the tyre specification';
//Then do thing with the tyre before returning the object
return tyre;
}
}
Chcę napisać dwa testy dla tych metod. Problem polega na tym, że piszę test dla GetVehicleByRegistrationNumber
Nie wiem, jak wyśmiewać wywołanie metody do GetTyreSpecification
.
Metody badań wyglądać następująco:
[TestClass]
public class SelecterTest
{
[TestMethod]
public void GetTyreSpecification_test()
{
//Arrange
var tyre = new Tyre { NumberOfTyres = 4, TyreSize = 18 };
var mockSelecter = new Mock<ISelecter>();
mockSelecter.SetUp(s=>s.GetTyreSpecification(It.IsAny<long>())).Returns(tyre);
//Act
var tyreSpec = mockSelecter.Object.GetTyreSpecification(123456);
//Assert
Assert.IsTrue(tyreSpec.NumberOfTyres == 4 && tyreSpec.TyreSize == 18);
}
[TestMethod]
public void GetVehicleByRegistrationNumber_test()
{
//Arrange
var vehicle= new Vehicle { VehicleIdentifier = 123456, RegistrationNumber = ABC123, TyreSpecification = new Tyre { Tyresize = 18, NumberOfTyres = 4 }};
var mockSelecter = new Mock<ISelecter>();
mockSelecter.SetUp(s=>s.GetVehicleByRegistrationNumber(It.IsAny<string> ())).Returns(vehicle);
//Act
var vehicle = mockSelecter.Object.GetVehicleByregistrationNumber(123456);
//Assert
Assert.IsTrue(vehicle.Registrationnumber == "ABC123";
}
}
W metodzie testowej GetVehicleByRegistrationNumber_test
jak mogę mock wywołanie getTyreSpecification
?
@VSO o jakiejkolwiek opinii na temat udzielonej odpowiedzi? – Nkosi
@Nkosi Hey Nkosi, nie ma szansy, aby to jeszcze sprawdzić, będę na to patrzeć jak najszybciej. Ty za pomoc jak zwykle! – VSO
@Nkosi Twoje testy są dobre! Nie próbuj testować więcej niż to, co robi twój test - nie powinieneś testować niczego więcej niż otrzymywanie pojazdu według numeru reg. Wszelkie testy specyficzne dla pojazdu powinny być przechowywane we własnych metodach testowych, takich jak napisane powyżej. Nie testuj więcej niż jednej rzeczy naraz. –