2015-09-17 13 views
9

Mam poniżej klasę i próbuję przetestować metodę AddRecordToQueue.Wartość ustawienia metody ustawiania Moq

Używam Moq, aby kpić z wyniku metody AddToQueue w ramach metody AddRecordToQueue.

Sposób AddToQueue zwraca wartość logiczną, więc staram się drwić wynik z prawdziwej wartości

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

Moja klasa test wygląda jak poniżej.

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

Nie mogę ustawić wyniku moq jako true. Może ktoś doradzić co mam brakuje

dzięki

+0

Nie w maszynie do testowania, ale są dwie rzeczy, które widzę tutaj. 1. Powinieneś 'Setup' zanim otrzymasz odwołanie do' .Object'; 2. W 'Setup' ustawiasz argumenty na wartość null, i opróżnij, spróbuj użyć' Setup (e => e.AddToQueue (It.IsAny(), Is.IsAny())). Returns (true)) ' – Eris

Odpowiedz

11

Myślę, że trzeba zmienić Returns po prostu wrócić prawdziwe zamiast lambda. Tak:

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

EDIT:

Jeśli to nadal nie działa to chyba ze względu na parametry nie pasujące. Przechodzisz w "someExchange", ale mock jest ustawiony na string.Empty. Jeśli nie jesteś pewien, jakie wartości będą używane, możesz użyć metody It.IsAny, aby ominąć to.

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

dziękuję, ale to nie zadziałało, nadal zwraca false – simon1230756

+0

Zaktualizowałem odpowiedź. – TomDoesCode

+0

Niezły. Dzięki stary. –

2

Musisz ustawić metodę z faktycznymi argumentami, które wywołuje. Jeśli JsonConvert.SerializeObject(data) zwraca null, to jest to konfiguracja:

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

Dodatkowo można skonfigurować sposób, aby powrócić prawda/fałsz, niezależnie od wartości argumentów:

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

Z powyższej konfiguracji, metoda zwróci true bez względu na to, co przekazałeś metodzie. Poprzedni przykład zwróci true tylko wtedy, gdy metoda zostanie wywołana z ustawionymi argumentami.

+0

Dzięki za wyjaśnienie. Właśnie zaczynam uczyć się testów jednostkowych z Moq –

1
  1. Jak powiedzieli inni, konfiguracja jest niepoprawna.
  2. Trzeba zadzwonić Setupprzed używając związane Object

Powinno być coś podobnego do:

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