TDD fácil com MVVM, NUnit e Moq no Windows Phone
Hoje vamos ver como testar suas aplicações no Windows Phone usando NUnit e o Moq.
1. Crie os projetos que vamos precisar:
Comece criando um novo projeto -> Windows Phone Application. De o nome de TddPhoneApp (ou qualquer outro).
Na sequência, crie um novo projeto do tipo Windows Phone Class Library e de o nome de PanoramaAppTdd.Tests.
2. Adicione as libraries necessárias
Vamos usar o NuGet para adicionar nossas bibliotecas. Abra “Package Manager Console”, selecione o projeto principal e digite:
1 |
PM> install-package wp7tools |
Vamos utilizar o wp7tools para mapear o evento de click de um botão para um método no ViewModel e também para mostrar mensagens ao usuário de maneira testável.
Agora, selecione o projeto de testes como “Default project” e digite:
1 |
PM> install-package nunit |
E depois:
1 |
PM> install-package moq -version 3.1.416.3 |
Assim instalamos o NUnit (para o testes de unidade) e o Moq (para nosso mock). Perceba que no caso do Moq, estamos usando uma versão mais antiga, compatível com o Silverlight utilizado no Windows Phone.
3. Escrevendo seu primeiro teste
A regra de negócio que vamos testar é bem simples: quando o usuário aperta o botão “Olá”, uma mensagem dizendo “Hello World” deve ser apresentada.
Ao invés de utilizar a classe MessageBox diretamente, vamos usar uma interface. Além disso trazer testabilidade ao nosso aplicativo, podemos usar no início o MessageBox como implementação padrão e facilmente trocá-lo para algo mais interessante no futuro.
Primeiramente vamos criar nosso MainViewModel, classe que vai conter toda lógica de nossa MainPage. Esta classe vai utilizar nosso serviço de mensagens, então vamos colocá-lo no construtor. Neste caso, vamos utilizar o IDialogService, já pronto no projeto wp7tools, adicionado anteriormente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using Wp7Tools.ViewServices; namespace TddPhoneApp { public class MainViewModel { private IDialogService _dialogService; public MainViewModel(IDialogService dialogService) { _dialogService = dialogService; } public void MostreHelloWorld() { //TODO: implementar lógica } } } |
Vamos agora ao nosso primeiro teste. Adicione a seguinte classe no projeto de testes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using Moq; using NUnit.Framework; using Wp7Tools.ViewServices; namespace TddPhoneApp.Tests { [TestFixture] public class MainViewModelTests { [Test] public void DeveMostrarMensagemDeHelloWorldAoUsuario() { Mock<IDialogService> dialogServiceMock = new Mock<IDialogService>(); MainViewModel viewModel = new MainViewModel(dialogServiceMock.Object); viewModel.MostreHelloWorld(); dialogServiceMock.Verify(x => x.ShowMessage("Hello World")); } } } |
Neste teste, estamos “mockando” o serviço de dialog e verificando com o Moq que ele realmente foi chamado.
Ao rodar este teste, ele deve falhar: esse é nosso “Red”. Para fazer o teste passar, basta adicionar essa linha no seu MainViewModel:
1 2 3 |
public void MostreHelloWorld() { _dialogService.ShowMessage("Hello World"); } |
E pronto :)
4. Juntando tudo
Agora que nosso teste passa, vamos conectar o ato de apertar o botão com o método MostreHelloWorld de forma declarativa. O wp7tools tem uma maneira bem simples de fazer isso. Abra a MainPage.xaml e adicione dentro do Grid ContentPanel:
[xml]
<Button Content=”Olá”>
<Commands:Events.Mappings>
<Commands:Map Event=”Click” ToMethod=”MostreHelloWorld” />
</Commands:Events.Mappings>
</Button>
[/xml]
E vamos juntar a View com o ViewModel no code-behind para simplificar:
1 2 3 4 |
public MainPage() { InitializeComponent(); DataContext = new MainViewModel(new DialogService()); } |
Rode o projeto e aperte o botão para ver a mensagem. E viva o TDD.