Frage

Ich bin neu in Moq und Lernen.

Ich brauche zu testen, dass eine Methode, den Wert erwartet zurückgibt. Ich habe ein noddy Beispiel zusammen zu meinem Problem zu erklären. Das scheitert kläglich mit:

  

"Argument: Expression ist kein Methodenaufruf: c => (c.DoSomething (" Jo " "Blog", 1) = "OK")"

Können Sie korrigieren, was ich tue falsch?

[TestFixtureAttribute, CategoryAttribute("Customer")]
public class Can_test_a_customer
{
    [TestAttribute]
    public void Can_do_something()
    {
        var customerMock = new Mock<ICustomer>();

        customerMock.Setup(c => c.DoSomething("Jo", "Blog", 1)).Returns("OK");

        customerMock.Verify(c => c.DoSomething("Jo", "Blog", 1)=="OK");
    }
}

public interface ICustomer
{
    string DoSomething(string name, string surname, int age);
}

public class Customer : ICustomer
{
    public string DoSomething(string name, string surname, int age)
    {
        return "OK";
    }
}

Auf den Punkt gebracht: wenn ich über eine Methode, wie man testen wollte, und ich weiß, dass ich wieder ein „OK“ Ich erwarte, wie würde ich schreibe es Moq mit

Vielen Dank für alle Vorschläge.

War es hilfreich?

Lösung

  1. Sie benötigen eine Testperson, die mit Mock-Objekten in Wechselwirkung tritt (es sei denn, Sie einen Lerntest für Moq gerade schreiben.) Ich schrieb unter einem einfachen up
  2. Sie Setup Erwartungen an das Mock-Objekt, um die genauen Argumente (strenge - wenn Sie natürlich wollen, sonst Verwendung Is.Any<string> beliebige Zeichenfolge akzeptieren) Angabe und Rückgabewerte angeben, wenn eine
  3. Ihre Testperson (als Teil des Gesetzes Schritt des Tests) wird auf Ihre Mock rufen
  4. Sie behaupten, die Testperson verhielt sich wie erforderlich. Der Rückgabewert von den Schein Methoden werden von der Testperson verwendet werden -. Überprüfen sie über die öffentliche Schnittstelle des Testperson
  5. Sie überprüfen auch, dass alle Erwartungen, die Sie getroffen angegeben wurden -. Alle Methoden, die man in der Tat genannt genannt zu erwarten waren

.

[TestFixture]
public class Can_test_a_customer
{
  [Test]
  public void Can_do_something()
  {
    //arrange
    var customerMock = new Moq.Mock<ICustomer>();
    customerMock.Setup(c => c.DoSomething( Moq.It.Is<string>(name => name == "Jo"),
         Moq.It.Is<string>(surname => surname == "Blog"),
         Moq.It.Is<int>(age => age == 1)))
       .Returns("OK");

    //act
    var result = TestSubject.QueryCustomer(customerMock.Object);

    //assert
    Assert.AreEqual("OK", result, "Should have got an 'OK' from the customer");
    customerMock.VerifyAll();
  }
}

class TestSubject
{
  public static string QueryCustomer(ICustomer customer)
  {
    return customer.DoSomething("Jo", "Blog", 1);
  }
}

Andere Tipps

Mock<T>.Verify nicht den Wert zurück, dass der Methodenaufruf zurückgegeben, so dass Sie nicht nur können es zu dem erwarteten Wert vergleichen mit „==“.

In der Tat gibt es keine Überlastung von Stellen Sie sicher, dass alles zurückgibt , denn man sollte nie ein verspottet Methode liefert einen bestimmten Wert überprüfen müssen, dass. Immerhin Sie waren verantwortlich für ihre Einrichtung den Wert in erster Linie zurück! Rückgabewerte der verspottete Methoden werden dort durch den Code verwendet werden Sie testen -. Sie sind nicht die Mocks testen

Verwenden Sie zur Bestätigung Überprüfen Sie, dass das Verfahren mit den Argumenten aufgerufen wurde Sie erwartet haben, oder dass eine Eigenschaft wurde ein Wert zugewiesen erwartet. Die Rückgabewerte von verspottete Methoden und Eigenschaften sind nicht wichtig, bis Sie auf die „assert“ Phase Ihres Tests erhalten.

Sie sind das gleiche tun, dieser Kerl hier tat: Wie andere Methode Überprüfen Sie in der Klasse genannt wurde Moq mit

Sie spotten, was Sie testen. Das macht keinen Sinn. Verwendung von Mocks ist für die Isolierung. Ihr Can_Do_Something Test immer passieren . Egal was. Dies ist nicht ein guter Test.

Nehmen Sie einen genaueren Blick auf Gishu-Test oder den Test, den ich in der verknüpften SO Frage vorgeschlagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top