2012-12-10 6 views
5

Jestem nowy w Moq i testowaniu jednostkowym. Robiłem test jednostki i to jest następujący kod:Interfejsy testowania jednostek z Moq

private Mock<IServiceAdapter> repository; 

    [TestInitialize] 
    public void Initialize() 
    { 
     repository= new Mock<IServiceAdapter>(); 
    } 

[TestMethod()] 
    public void SaveTest() 
    { 
     //Setup 
     string Name = "Name1"; 
     string Type = "1"; 
     string parentID = null; 

     repository.Setup(x => x.Save(Name , Type, parentID)).Returns("Success").Verifiable(); 

     //Do 
     var result = repository.Object.Save(Name , Type, parentID); 
     //Assert 
     repository.Verify(); 
    } 

Moim problemem jest to, że test będzie zawsze zwraca ciąg znaków, który włożyłem w parametrze wróci, innymi słowy, będzie to zawsze wrócić „sukces "lub cokolwiek piszę na jego miejscu. Myślę, że to nie jest w porządku, ponieważ nie jest to prawdziwe zachowanie usługi. Czy ktoś wie, w jaki sposób mogę odzwierciedlić rzeczywiste zachowanie usługi "Zapisz", którą próbuję przetestować? Powiedzmy więc, że jeśli zwracany łańcuch różni się od metody serwisowej, test powinien zakończyć się niepowodzeniem.

Edited

Interfejs ServiceAdapter jej po prostu otoki dla usługi sieci Web, które ja nazywam jak REST Service. To projekt Web Forms.

robię coś podobnego w tym poście

How to mock a web service

należy utworzyć coś w rodzaju FakeController z Dependency Injection, aby to działało?

Odpowiedz

11

Testujesz naśmiewa się tutaj, co nie daje ci nic (ponieważ ta sztuczka nie jest używana w twojej prawdziwej aplikacji). W testowaniu jednostkowym powinieneś tworzyć i testować swoje prawdziwe obiekty, które istnieją w twojej prawdziwej aplikacji (tj. Implementacje interfejsu). Mocks używane do kpijania zależności testowanych obiektów.

Tak, makieta adaptera usługi będzie przydatna do testowania obiektu, który korzysta z tego adaptera, np. niektóre testy kontrolerów:

private FooController _controller; // object under test, real object 
private Mock<IServiceAdapter> _serviceAdapter; // dependency of controller 

[TestInitialize] 
public void Initialize() 
{ 
    _serviceAdapter = new Mock<IServiceAdapter>(); 
    _controller = new FooController(_serviceAdapter.Object); 
} 

[TestMethod()] 
public void SaveTest() 
{ 
    // Arrange 
    string name = "Name1"; 
    string type = "1"; 
    string parentID = null; 

    _serviceAdapter.Setup(x => x.Save(name , type, parentID)) 
        .Returns("Success").Verifiable(); 

    // Act on your object under test! 
    // controller will call dependency 
    var result = _controller.Bar(name , type, parentID); 

    // Assert 
    Assert.True(result); // verify result is correct 
    _serviceAdapter.Verify(); // verify dependency was called 
} 
+0

Coś tu brakuje. Nie mam kontrolera (to są formularze internetowe). Podam więcej informacji w pytaniu. –

+0

@ Kontroler MorganSoren był tylko przykładem. Może to być jakakolwiek inna klasa korzystająca z adaptera usługi. Wydaje mi się, że formularze sieciowe nie są tak testowane w jednostkach, jak to zazwyczaj ma miejsce w przypadku formularzy MVP używanych do tworzenia testowalnych aplikacji internetowych. –

+0

@MorganSoren tutaj jest pytanie dotyczące [formularzy internetowych testów jednostkowych] (http://programmers.stackexchange.com/questions/116089/is-is-possible-to-unit-test-a-web-forms-site) –