Wie zu verwenden Moq in der unit test ruft eine andere Methode in derselben Klasse

Hallo ich bin neu Moq-framework und haben einige Fragen über wie man es benutzt. Ich will Euch ein Beispiel geben und hoffe auf Antworten.

Ich habe zwei Klassen, eine Schnittstelle und eine Implementierung:

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;
    }
}

Möchte ich mal zwei tests für diese Methoden. Das problem ist, wenn ich Schreibe, den test für GetVehicleByRegistrationNumber ich weiß nicht, wie mock Aufruf der Methode zu GetTyreSpecification.

Den test-Methoden wie folgt Aussehen:

[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";
    }
}

In der test-Methode GetVehicleByRegistrationNumber_test wie kann ich verspotte den Aufruf getTyreSpecification?

  • feedback über die Antwort, die ich zur Verfügung gestellt?
  • Hey Nkosi, keine chance, Sie zu überprüfen, noch werde ich es so schnell wie möglich. Ty für die Hilfe, wie immer!
  • Die tests sind gut! Versuchen Sie nicht, zu testen, mehr als das, was Ihr erklärtes test hat - Sie sollten nicht Test nichts mehr, als sich ein Fahrzeug durch die reg-Nummer. Jedes Fahrzeug spezifische tests gehalten werden sollte, in Ihren eigenen test-Methoden, wie Sie bereits oben geschrieben habe. Testen nicht mehr als eine Sache zu einer Zeit.
InformationsquelleAutor user2227138 | 2013-05-14
Schreibe einen Kommentar