2017-03-16 3 views
1

Ich habe gerade mit Komponententests mit Moq-Objekt gestartet, ich bin mir nicht sicher, ob ich das richtig mache oder nicht, bitte helfen Sie !!Nicht in der Lage, moq in Unit-Test zu verwenden

Public Class Mrr: IMrr 
{ 

    public int Delete(double obj) 
    { 
     int rtcode = somefunction(obj);// retreiving some code from function 
     int DeleteMrr= DeleteFunction(rtcode); // delete function executes here   
     return 0; 
    } 

} 

hier ist die Schnittstelle

public interface IMrr 
{ 
    int Delete(double obj); 
} 

und meine Testmethode ist so etwas wie diese.

Dies geht nicht zu der eigentlichen Funktion, um diese Methode auszuführen, es soll dort zur Methode gehen oder nicht. Ich bin nicht sicher.

Antwort

1

Wenn Sie die Methode Mrr.Delete() testen, sollten Sie nicht Mrr vortäuschen. Sie sollten eine reale Instanz der Klasse Mrr erstellen und ihre Methoden aufrufen.

Normalerweise möchten Sie Mrr Abhängigkeiten spotten (es gibt keine in Ihrem Beispiel), so dass echte Abhängigkeiten Methoden nicht aufgerufen werden.

Hinweis: Sie haben vergessen, Mrr von Ihrer Schnittstelle IMrr zu erben.

+0

HALLO, ich meinen Code bearbeitet, können Sie mir bitte sagen, was sind die wirklichen Abhängigkeiten Sie hier reden? –

+0

Bitte überprüfen Sie dieses grundlegende Tutorial für Moq - http://deanhume.com/home/blogpost/basic-introduction-to-writing-unit-tests-with-moq/16 – CodeFuller

+0

ist die Schnittstelle für die Implementierung notwendig? –

1

In Ihrem Beispiel hat die Klasse Mrr keine Abhängigkeiten. Um zu erklären, was eine Abhängigkeit ist, schauen Sie sich das folgende Beispiel an.

Diese Abhängigkeit wird im Konstruktor übergeben, sodass Sie in Tests eine eigene Mock-Instanz bereitstellen können.

Vergleichen Sie mit dieser Situation:

public class Mrr: IMrr 
{ 
    // This is dependency 
    IDelete _deleteObject; 

    public Mrr() 
    { 
     _deleteObject = new DeleteClass(); 
    } 
} 

Jedesmal new verwendet wird es unmöglich macht, eine eigene Implementierung in Unit-Tests zu injizieren.

Der Test könnte dann so aussehen.

[TestMethod] 
public void RetrieveSaveDeleteMRR() 
{  
    // Arange 
    int expected = 1; 
    Moq.Mock<IDelete> deleteObjectMock = new Moq.Mock<IDelete>(); 
    deleteObjectMock.Setup(x => x.DeleteFunction(It.IsAny<int>())).Returns(1000); 
    Mrr testedObject = new Mrr(deleteObjectMock.Object); 

    // Act 
    int actual = testedObject.Delete(10); 

    // Assert 
    Assert.AreEqual(expected, actual); 
}