2015-09-17 21 views
9

Ho la classe seguente e sto provando a testare il metodo AddRecordToQueue.Valore restituito metodo impostazione Moq

Sto usando Moq per deridere il risultato del metodo AddToQueue all'interno del metodo AddRecordToQueue.

Il metodo AddToQueue restituisce un valore booleano, quindi sto cercando di prendere in giro il risultato con un valore vero

public class Test 
{ 
    private readonly IRabbitMqConnection rabbitMqConnection; 

    public Test(IRabbitMqConnection rabbitMqConnection) 
    { 
     this.rabbitMqConnection = rabbitMqConnection; 

    } 

    public bool AddRecordToQueue(string messageExchange, object data) 
    { 
     var jsonified = JsonConvert.SerializeObject(data); 
     var customerBuffer = Encoding.UTF8.GetBytes(jsonified); 
     var result = this.rabbitMqConnection.AddToQueue(customerBuffer, messageExchange); 
     return result; 
    } 
} 

mia classe di test si presenta come il seguente.

[TestClass] 
public class TestCon 
{ 
    [TestMethod] 
    public void MockTest() 
    { 
     Moq.Mock<IRabbitMqConnection> rabbitConection = new Moq.Mock<IRabbitMqConnection>(); 

     var draftContactsManager = new Test(rabbitConection.Object); 

     rabbitConection.Setup(e => e.AddToQueue(null, string.Empty)).Returns((bool res) => true); 

     var result = draftContactsManager.AddRecordToQueue("someExchange", null); 

     Assert.IsTrue(result); 
    } 
} 

Non riesco a impostare il risultato moq come vero. Può chiunque raccomandare che cosa manco

grazie

+0

Non a una macchina per testare, ma ci sono due cose che vedo qui. 1. Dovresti 'Setup' prima di ottenere un riferimento a' .Object'; 2. In 'Setup', imposti gli argomenti a null e svuota, prova a usare' Setup (e => e.AddToQueue (It.IsAny(), Is.IsAny())). Returns (true)) ' – Eris

risposta

11

Penso che è necessario modificare la Returns per tornare solo vero posto del lambda. Come questo:

rabbitConection.Setup(e => e.AddToQueue(null, string.Empty)).Returns(true) 

EDIT:

Se questo ancora non funziona, allora è probabilmente dovuto ai parametri non corrispondenti. Stai passando in "someExchange" ma il mock è impostato per string.Empty. Se non si è sicuri di quali valori verranno utilizzati, è possibile utilizzare il metodo It.IsAny per aggirare questo problema.

rabbitConection.Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>())).Returns(true) 
+0

grazie, ma non ha funzionato, restituisce ancora false – simon1230756

+0

Ho aggiornato la risposta. – TomDoesCode

+0

Bello. Grazie fratello. –

2

È necessario impostare il metodo con gli argomenti effettivi su cui è stato richiamato. Se JsonConvert.SerializeObject(data) restituisce NULL, allora questo è il programma di installazione:

rabbitConection.Setup(e => e.AddToQueue(null, "someExchange")).Returns(true) 

Inoltre, è possibile impostare il metodo per restituire true/false indipendentemente valori degli argomenti:

rabbitConection.Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>())).Returns(true) 

Con l'impostazione sopra descritta, il metodo restituirà true indipendentemente da ciò che hai passato al metodo. L'esempio precedente restituirà true solo quando il metodo viene chiamato con gli argomenti impostati.

+0

Grazie per aver spiegato. Sto appena iniziando a imparare Unit Testing con Moq –

1
  1. Come gli altri hanno detto, l'installazione non è corretta.
  2. è necessario chiamare Setupprima usando il associati Object

Dovrebbe essere qualcosa di simile a:

... 
rabbitConection 
    .Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>())) 
    .Returns(true); 
var draftContactsManager = new Test(rabbitConection.Object); 
...