Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

144
Vistas
Cómo sustituir una llamada de función desde un objeto que se instancia en la función bajo prueba

Estoy tratando de escribir algunas pruebas unitarias. La aplicación tiene una serie de llamadas API externas que me gustaría simular usando NSubstitute. El problema es que estas llamadas usan objetos de servicio que deben instanciarse en la función y no se pueden pasar en el constructor después de la sustitución.

Por ejemplo, en el siguiente código estoy agregando una cuenta a Quickbooks:

 public async Task AddQuickbooksAsync(int accountId) { var qbChannel = await GetQuickbooksChannel(); var account = await GetAsync(accountId); var quickbooksBO = new QuickbooksBO(qbChannel); quickbooksBO.AddAccount(account); quickbooksBO.UpdateRefreshedTokens(qbChannel); await context.SaveChangesAsync(); }

Quiero simular la siguiente llamada de función usando NSubstitute, pero no pude averiguar cómo:

 var quickbooksBO = new QuickbooksBO(qbChannel); quickbooksBO.AddAccount(account);

¿Cómo puedo hacer esto?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

No puedes burlarte de una variable local. Puede crear un método virtual que devolverá QuickbooksBO y lo sustituirá.

 public async Task AddQuickbooksAsync(int accountId) { var qbChannel = await GetQuickbooksChannel(); var account = await GetAsync(accountId); var quickbooksBO = GetQbBO(qbChannel); quickbooksBO.AddAccount(account); quickbooksBO.UpdateRefreshedTokens(qbChannel); await context.SaveChangesAsync(); } public virtual QuickbooksBO GetQbBO(Channel qbChannel) { return new QuickBooks(qbChannel); }

Después de eso, puede sustituirlo en su servicio:

 var s = Substitute.ForPartsOf<Service>(); s.GetQbBO(default).ReturnsForAnyArgs(substituteForQbBO);

Deberá averiguar qué partes de QuickBooksBO desea simular. Por lo general, tales dependencias deberían ser interfaces, sin interfaces, las pruebas unitarias son bastante limitadas.

Si los métodos de QuickbooksBO son virtuales, puede hacer algo como esto para obtener su substituteForQbBO :

 var substituteForQbBO = Substitute.ForPartsOf<QuickbooksBO>(); substituteForQbBO.WhenForAnyArgs(x => x.AddAccount(default)).DoNotCallBase(); substituteForQbBO.WhenForAnyArgs(x => x.UpdateRefreshedTokens(default)).DoNotCallBase();
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda