NSubstitute не может определить спецификации аргументов для использования при запуске проекта «Все тесты». - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть метод испытания:

public class MyTests
{
  [Fact]
  public void Test_Method()
  {
     // Arrange 
     var returns = Result.Ok(new List<string>() { "Test" }.AsEnumerable());  

     this.mockService.ServiceMethod(Arg.Any<Guid>()).Returns(returns); //returns Result<IEnumerable<string>>


     //Act
     var actResult = this.anotherService.Backup();

     //Assert
     Assert.True(actResult.Success);
  }
  ...

Для проверки этого метода:

public class AnotherService
{

  internal Result Backup()
  {
    var ret = this.mockService.ServiceMethod().Value;

    ...

    return Result.Ok();
  }

Когда я запускаю метод только для Test_Method(), все происходит нормально. Когда я пытаюсь запустить весь класс MyTests, я получаю следующую ошибку в этом методе ссылки:

NSubstitute.Exceptions.AmbiguousArgumentsException: «Не удается определить спецификации аргументов для использования. Пожалуйста, используйте спецификации для всех аргументы того же типа. '

Я считаю, что эта проблема не имеет ничего общего с этим сценарием: Как НЕ использовать сопоставления аргументов

NSubstitute.Analyzers:

NSubstitute.Analyzers

Есть что-нибудь сделать?

1 Ответ

0 голосов
/ 05 ноября 2018

Обновление после комментариев и обновление вопроса:

Если после внесения изменений в исходный ответ все еще возникают проблемы, это может быть еще один тест в приборе, вызывающий проблему. Я рекомендую добавить NSubstitute.Analyzers в проект, который может выявить потенциальные проблемы с использованием NSubstitute во время компиляции с использованием Roslyn. (Я рекомендую добавить это ко всем проектам, использующим NSubstitute; это действительно может помочь избежать многих потенциальных проблем!)

Если NSubstitute.Analyzers не находит ошибку, то, к сожалению, у нас осталось несколько ручных шагов, как описано в этом ответе .


Оригинальный ответ:

Соответствующие аргументы должны использоваться вместе с указанием вызова или подтверждением того, что вызов получен.

Тест, который вы опубликовали, имеет два места, которые могут вызывать эту проблему:

  • Как упомянул @Fabio в комментарии, в mockService.ServiceMethod() используется сопоставление аргументов без соответствующего .Returns.
  • Соответствующий аргумент используется для реального вызова anotherService.Backup()

Попробуйте изменить тест следующим образом:

  [Fact]
  public void Test_Method()
  {
     // Arrange       
     this.mockService.ServiceMethod(Arg.Any<Guid>()).Returns(...);
     //                               ^- Arg matcher   ^- so need Returns()

     //Act
     var actResult = this.anotherService.Backup(Guid.NewGuid());
     //         Do not use arg matchers for real calls -^

     //Assert
     Assert.True(actResult.Success);
  }

Может быть и другая причина этой проблемы в вашем приборе, но эти два использования сопоставителей аргументов определенно не помогут!

Эти проблемы описаны в документации для сопоставления аргументов , которую вы упомянули; если документация по этим пунктам неясна, пожалуйста, поднимите вопрос с любыми предложениями по улучшению этого раздела. Очень полезно получить информацию о документации с других точек зрения, поэтому любой вклад, который вы можете внести в этом отношении, будет высоко оценен!

...