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?