Como criar uma interface que mantenha alguns métodos internos para testes em C #?
Considere a seguinte classe
public class Entity {
public void Foo() { ... }
internal void Bar() { ... }
}
Como você vê, tem umpublic
método e uminternal
método. Agora, gostaria de criar uma interface que me permita zombar dessa classe em testes (tanto nesta assembléia como em outros). Eu reescrevi meu código da seguinte forma:
public interface IEntity {
void Foo();
}
internal class Entity : IEntity {
public void Foo() { ... }
public void Bar() { ... }
}
No entanto, isso cria outro problema. Ao usar a classe em outro método no mesmo assembly, não consigo chamarBar
não mais:
public class OtherClass {
public void SomeMethod(IEntity entity) {
entity.Bar(); // error!
}
}
Reescrevendo o código assim:
public class OtherClass {
public void SomeMethod(IEntity entity) {
(entity as Entity).Bar(); // error in test!
}
}
irá desencadear um erro no teste de unidade que acionaSomeMethod
. Como reescrevo meu código para que eu ainda possa usarinternal
métodos na mesma assembléia e ainda só expor membros públicos a outras assembléias?
Atualizar: ClasseOtherClass
é uma classe de utilitário que precisa operar em internals doEntity
classe, que não são expostos diretamente aos usuários. No entanto, esta classe em si é exposta aos usuários, então eles indiretamente têm acesso aos internos doEntity
. Isso é desejado comoSomeMethod
fará as verificações necessárias para garantir que os usuários não estraguem o estado interno de umEntity
objeto.