Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

141
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!