2013-06-04 15 views
16

Jestem nowym Moq i testowanie w ogóle więc tutaj jest mój noobish Q. Jak mogę sprawdzić, czy Stan nieruchomość na Zamówienie została ustalona przy użyciu MOQ?Sprawdź, czy nieruchomość została ustawiona - używając Min

public class DudeManager 
{ 
     private readonly IDRepository _repo; 

     public DManager(IDRepository repo) 
     { 
      _repo = repo; 
     } 

     public void Create(Request r) 
     { 
      r.Status = Status.Submitted; 
      _repo.AddRequest(r); 
     } 
} 

Czy istnieje lepsze podejście niż następujące? Może za pomocą VerifySet?

 [TestMethod] 
     public void AddingNewRequestSetsStatusToSubmitted() 
     { 
      //Arrange 
      var mock = new Mock<IDRepository>(); 
      var mockRequest = new Mock<Request>(); 
      var dManager = new DManager(mock.Object); 

      //Act 
      dManager.Create(mockRequest.Object); 

      //Assert 
      Assert.AreEqual(Status.Submitted, mockRequest.Object.Status); 
     } 

EDIT: To podejście skończyło się używając po wszystkich pomocnych sugestii:

//Arrange 
var request = new Request(); 
var mock = new Mock<IDRepository>(); 
var dManager = new DManager(mock.Object); 
mock.Setup(x => x.AddRequest(It.IsAny<Request>())); 

//Act 
dManager.QueueNewRequest(request); 

//Assert 
Assert.AreEqual(RequestStatus.Submitted, request.Status); 

Takie podejście wydaje się prawo do mnie. Czy ktoś myśli inaczej?

+0

Uważam, że VerifySet najlepiej pasuje. – neontapir

+0

Czy możesz pokazać mi przykład, jak z niego korzystać? Próbowałem używać VerifySet, ale to mnie rozkręciło. –

+0

Nie jestem przekonany, że VerifySet robi cokolwiek, nigdy nie byłem w stanie zestrzelić testu, zawsze przechodzi. Przechodzę przez debugger i widzę, że moja próba to callbase, właściwość, o której mowa, jest zerowa, bez wywołań. VerifySet z doliną "Hello world" i rzecz idzie ... przejść. Chciałbym pójść z ramami testów jednostkowych i stwierdzić, że to jest równe. –

Odpowiedz

25

Uważam, że VerifySet to właściwe podejście. to będzie wyglądać mniej więcej tak:

//Arrange 
var mock = new Mock<IDRepository>(); 
var mockRequest = new Mock<Request>(); 
// TODO: set some expectations here 

var dManager = new DManager(mock.Object); 

//Act 
dManager.Create(mockRequest.Object); 

//Assert 
mockRequest.VerifySet(x => x.Status = Status.Submitted); 

wierzę w Twoim przypadku, to wysadza ponieważ nie został skonfigurowany do obsługi żądania makiety operację ustawioną Stanu.

Prostym sposobem na to jest za pomocą SetupAllProperties, tak:

//Arrange 
var mock = new Mock<IDRepository>(); 
var mockRequest = new Mock<Request>(); 
mockRequest.SetupAllProperties(); 
+0

Nadal nie powiedzie się z powodu następującego błędu: Test Wynik: \t Failed wyrzucił wyjątek: System.ArgumentException: nieprawidłowa konfiguracja na wirtualnym (nie przeciążać w VB) Państwo: –

+1

Oczywiście Zapytanie nie jest interfejsem w przypadku . Aby to działało, musisz zaznaczyć właściwość Status jako wirtualną. I, jak wspomniano poniżej @ AD.net, chyba że Żądanie ma złożone zachowanie, nie ma potrzeby kpić z niego. – neontapir

+0

Druga odpowiedź Ufuk Hacıoğulları też działała, ale zmodyfikowałem tę wersję bez wyśmiewanego obiektu Request. Spodobał mi się pomysł, aby nie kpić z obiektu Request, a następnie używać klasy Assert, aby sprawdzić, czy jest on równy - nie jestem pewien, czy to jest właściwa droga, ale wydaje mi się, że to dobrze (edytowałem post, aby pokazać moją zmodyfikowaną/działającą wersję. skomentuj, jeśli jest to zła praktyka –

5

myślę, że należy użyć ścisłe zachowanie domyślnie, a następnie można dokonać weryfikacji za pomocą jednego połączenia. To także sprawia, że ​​piszesz test bardziej wyraźnie.

[TestMethod] 
public void AddingNewRequestSetsStatusToSubmitted() 
{ 
    //Arrange 
    var mock = new Mock<IDRepository>(MockBehavior.Strict); 
    var mockRequest = new Mock<Request>(MockBehavior.Strict); 
    var dManager = new DManager(mock.Object); 

    mockRequest.SetupSet(item => item.Status = It.IsAny<StatusType>()) 
       .Verifiable(); 

    //Act 
    dManager.Create(mockRequest.Object); 

    //Assert 
    Assert.AreEqual(mockRequest.Object.Status, Status.Submitted); 
    mock.VerifyAll(); 
    mockRequest.VerifyAll(); 
} 
4
mock.Verify(m=>m.AddRequest(It.Is<Request>(r=>r.Status == expectedStatus))); 

Można sprawdzić, że metoda jest wywoływana AddRequest z parametrem (Request), który ma prawidłowy Status. Również kpiny z obiektu Request nie są tutaj naprawdę potrzebne.