c# visual-studio unit-testing mstest resharper-5.1

c# - La clase de prueba heredada de la base genérica se ignora en MSTest



Al crear una clase de prueba base genérica en MSTest y heredarla, no puedo ejecutar las pruebas de todas las clases heredadas.

BaseDependencyPropertyFactoryTest se encuentra en el ensamblado Whathecode.PresentationFramework.Tests . Es la clase base genérica. ( BaseDependencyPropertyFactoryTest <TTestClass> )

Ambos conjuntos tienen una prueba que se hereda de esta clase base, llamada DependencyPropertyFactoryTest . Todo lo que hace la clase heredada es pasar un tipo específico de argumento.

[TestClass] public class DependencyPropertyFactoryTest : BaseDependencyPropertyFactoryTest<ASpecificClass> { }

Solo la prueba de herencia ubicada en el mismo ensamblaje que la clase base parece ejecutarse. La prueba heredada en el ensamblado Whathecode.PresentationFramework.Aspects.Tests parece ignorarse por completo.

¿Qué estoy haciendo mal? Cuando lo desee, podría cargar todo el código fuente requerido, pero necesitará PostSharp para el montaje de los aspectos.

Como prueba, intenté agregar una prueba a la clase de prueba heredada en el conjunto de aspectos, que llama a todas las pruebas en la clase de prueba base.

[TestMethod] public void AllBaseTests() { ClrGetterSetterTest(); DependencyPropertyGetterSetterTest(); }

Esto da el siguiente resultado. Curiosamente esta prueba se ejecuta! Por ahora esto podría funcionar como una forma de al menos ejecutarlos, pero, por supuesto, no quiero editar esta prueba cada vez que agregué pruebas adicionales en la clase base.

¿Por qué se omiten esas pruebas básicas y por qué la indicación "Abortada"?


La causa de esto no tiene que ver con los genéricos, sino con las pruebas en diferentes ensamblajes.

Una sugerencia de Microsoft Connect describe el problema: "Visual Studio Test (MSTest) y la falta de compatibilidad de herencia para las clases base que residen en diferentes ensamblajes". Está marcado como ''fijo'', pero parece que aún no se ha corregido en Visual Studio 2010, ¿tal vez aún deba publicarse?

Hay una solución interesante para este problema:

Puede solucionar este problema compilando el archivo fuente que contiene la clase base en todos los proyectos de prueba que desean derivar de esa clase base. Agregue el elemento como un "enlace" para no terminar con varias copias del archivo fuente para la clase base.

Esto funcionó para mí, y no encuentro la solución demasiado fea.


La respuesta de Steven de agregar el archivo fuente de la clase base como un enlace y luego compilarlo en la dll de prueba también funcionó para mí.

Sin embargo, a partir de la Actualización 2 de VS 2013, ahora hay un concepto de "Proyecto compartido" que es una forma de formalizar la idea de incluir el código fuente de otro proyecto en su proyecto y luego compilarlos como uno solo.

Esto es lo que hice

  1. Crear nuevo proyecto "Proyectos compartidos"
  2. Mueva la clase base de prueba actual (y otros archivos necesarios) al proyecto compartido
  3. Agregue una referencia al proyecto compartido de su proyecto de prueba (más sobre esto más adelante)
  4. Compila, prueba y se feliz

Al menos en la Actualización 2 de VS2015, el paso 3 no es tan sencillo como creo que debería ser. Según esta respuesta, Visual Studio no le proporciona una manera fácil de vincular proyectos compartidos para probar proyectos (vea la figura ...). Esto es lo que tenía que hacer:

  1. Descargue el archivo .csproj,
  2. Haga clic derecho y edite el archivo .csproj
  3. Vaya hasta el final y agregue esto al inicio del grupo <Import ...> (corrija la ruta y el nombre según sea necesario, asegúrese de agregar Label="Shared" !):

    <Import Project="../SharedProject/SharedProject.projitems" Label="Shared" />

  4. Guarde y cierre el archivo

  5. Recargar el proyecto

Nada especial, pero otra forma de resolver el problema llamando a los métodos base es:

public abstract class AccountBaseTest { protected abstract IAccountRepository GetAccountRepository(); public void _submitAccountToLMS_BlankAccount_NewLmsID() { Account account = new Account(GetAccountRepository()); account.FirstName = Faker.FirstName(); account.LastName = Faker.LastName(); account.SubmitToLms(); Assert.IsTrue(account.LmsID > 0); } } [TestClass] public class AccountIntegrationTest { protected override IAccountRepository GetAccountRepository() { return new AccountRepository(); } [TestMethod] public void SubmitAccountToLMS_BlankAccount_NewLmsID() { base._submitAccountToLMS_BlankAccount_NewLmsID(); } }

Esperemos que VS 2012 solucione este problema ....