Jump to content

dev botao

Criar Mock Da Classe Acbrecf Para Testes Unitários


  • Este tópico foi criado há 3603 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 to comment
Share on other 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 to comment
Share on other 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? 

Edited by Rafael Dias
Removido classes pois a mesma esta no post abaixo
  • Like 1
Link to comment
Share on other sites

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.