Ir para conteúdo
  • Cadastre-se

dev botao

Criar Mock Da Classe Acbrecf Para Testes Unitários


  • Este tópico foi criado há 3436 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa tarde.

 

Estou escrevendo testes unitários em C# utilizando o Moq Framework com o objetivo de criar um Mock da classe ACBrECF, mas estou encontrando algumas dificuldades.

 

Utilizando o código abaixo o Mock é criado mas a propriedade Device é instanciada como null pois a classe ACBrDevice não possuí um construtor público.

var acbrECFMock = new Mock<ACBrECF>();

Alguma ideia de como criar este Mock?

 

Desde já, muito obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

Pois é, mas o Moq (https://github.com/Moq/moq4) não inicializa a classe original, ele utiliza o Castle DynamicProxy (http://www.castleproject.org/projects/dynamicproxy/) para criar um objeto fake com a mesma interface mas que responde aos métodos conforme configuramos o setup do mock. Mas como o ACBrDevice não possuí um construtor público ele não consegue criá-lo.

 

Acredito que uma alternativa seria criar Interfaces para as classes utilizadas no ACBrFramework.Net, dessa maneira qualquer classe poderia ser mockada. Isso facilitaria bastante os testes de projetos que utilizam o ACBrFramework.Net.

Link para o comentário
Compartilhar em outros sites

Criei as seguintes Interfaces no projeto:

IACBrECF e IACBrDevice

E fiz com que as classes implementassem essas Interfaces:

public class ACBrECF : ACBrComponent, IACBrECF
public class ACBrDevice : ACBrComposedComponent, IACBrDevice

Desta maneira foi possível mockar a ACBrECF e a ACBrDevice, como por exemplo no código abaixo:

var acbrDeviceMock = new Mock<IACBrDevice>();

var acbrECFMock = new Mock<IACBrECF>();
acbrECFMock.SetupGet(mock => mock.Device).Returns(acbrDeviceMock.Object);
acbrECFMock.Setup(mock => mock.EmLinha(1)).Returns(true);
acbrECFMock.Setup(mock => mock.GrandeTotal).Returns(0m);
acbrECFMock.Setup(mock => mock.IdentificaPAF(It.IsAny<string>(), It.IsAny<string>())).Verifiable();

A princípio a implementação destas Interfaces não deve quebrar nenhum código existente para quem utiliza o ACBrNFeFramework.Net.

 

Não realizei testes muito avançados e ainda não tenho grande conhecimento no projeto, mas com essas duas Interfaces já foi possível notar a melhora na testabilidade.

 

O ideal seria que todas as classes públicas do projeto tivessem Interfaces também. O que acham? 

Editado por Rafael Dias
Removido classes pois a mesma esta no post abaixo
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3436 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.