Los pasos que describes establecer Moq para poner a prueba las clases internas y miembros también lo han hecho en realidad nada que ver con la evaluación de un método protegido o privado
métodos privados de análisis es un poco de olor, realmente deberías probar solo la API pública. Si considera que el método es realmente importante y necesita ser probado de manera aislada, ¿quizás merece ser parte de su propia clase, donde puede ser probado por sí mismo?
Si su corazón está puesto en probar el método protegido de arriba se puede rodar su propia Mock en su conjunto de prueba:
public class CustomerServiceMock : CustomerService {
public void DoSomethingTester() {
// Set up state or whatever you need
DoSomething();
}
}
[TestMethod]
public void DoSomething_WhenCalled_DoesSomething() {
CustomerServiceMock serviceMock = new CustomerServiceMock(...);
serviceMock.DoSomethingTester();
}
Si era privado que probablemente podría hacer algo raro con la reflexión, pero ir por ese camino es la forma de probar el infierno.
actualización
Mientras que usted ha dado ejemplo de código en su pregunta que realmente no veo cómo desea "probar" el método protegido así que voy a llegar a algo artificial. ..
digamos que su servicio al cliente es el siguiente: -
public CustomerService : ICustomerService {
private readonly ICustomerRepository _repository;
public CustomerService(ICustomerRepository repository) {
_repository = repository;
}
public void MakeCustomerPreferred(Customer preferred) {
MakePreferred(customer);
_repository.Save(customer);
}
protected virtual void MakePreferred(Customer customer) {
// Or more than likely some grungy logic
customer.IsPreferred = true;
}
}
Si quería probar el método protegido que pueda ju st hacer algo como: -
[TestClass]
public class CustomerServiceTests {
CustomerServiceTester customerService;
Mock<ICustomerRepository> customerRepositoryMock;
[TestInitialize]
public void Setup() {
customerRepoMock = new Mock<ICustomerRepository>();
customerService = new CustomerServiceTester(customerRepoMock.Object);
}
public class CustomerServiceTester : CustomerService {
public void MakePreferredTest(Customer customer) {
MakePreferred(customer);
}
// You could also add in test specific instrumentation
// by overriding MakePreferred here like so...
protected override void MakePreferred(Customer customer) {
CustomerArgument = customer;
WasCalled = true;
base.MakePreferred(customer);
}
public Customer CustomerArgument { get; set; }
public bool WasCalled { get; set; }
}
[TestMethod]
public void MakePreferred_WithValidCustomer_MakesCustomerPreferred() {
Customer customer = new Customer();
customerService.MakePreferredTest(customer);
Assert.AreEqual(true, customer.IsPreferred);
}
// Rest of your tests
}
El nombre de este "patrón" es prueba subclase específica (basado en xUnit terminología patrones de prueba) para obtener más información es posible que desee ver aquí: -
http://xunitpatterns.com/Test-Specific%20Subclass.html
Según sus comentarios y preguntas anteriores, parece que se le ha encomendado la tarea de implementar pruebas unitarias sobre algún código heredado (o tomó la decisión usted mismo).En cuyo caso, el código heredado de la Biblia de todas las cosas es el libro de Michael Feathers. Cubre técnicas como esta, así como refactorizaciones y técnicas para tratar la descomposición de clases y métodos "no comprobables" en algo más manejable y lo recomiendo encarecidamente.
Veo hacia dónde va y tiene sentido. Simplemente comencé a trabajar en nuevos proyectos y un montón de pruebas de códigos y no unidades. ¿Es un buen trabajo para refactorizar todos estos métodos privados en una clase interna y hacerlos públicos? ¿Es posible probar una clase interna? – user9969
Es posible probar una clase interna utilizando el atributo InternalsVisibleTo, como describió al principio de su pregunta. –
Retomando el resto de la pregunta. La pregunta más profunda es por qué quieres probar a un miembro privado en primer lugar, y por qué quieres que Moq lo haga? –