MoQ не устанавливает метод Returns - PullRequest
1 голос
/ 13 февраля 2020

Здравствуйте, я использую MoQ, и я пытаюсь понять, почему возвращаемое значение моего метода действительно используется. В приведенном ниже примере я создаю службу, используя поддельную зависимость интерфейса. Я устанавливаю, что должен возвращать метод интерфейса. Однако, когда служба использует мою ложную зависимость, возвращаемое значение равно нулю, а не то, которое я установил в методе Returns. Почему это происходит?

Модель

public class SomeModel
{
  public string Name {get;set;}
}

Модифицированная зависимость

public interface IDependency
{
    Task<SomeModel> GetByIdAsync(string input);
}

Сервис с использованием макета Зависимость

public class SomeService
{
  private IDependency dependency;
  public SomeService(IDependency dependency)
  {
    this.dependency=dependency;
  }
  public async Task<SomeModel> GetByIdAsync(string id)
  {
     var model=await this.dependency.GetByIdAsync(id); //why is the result null , i have set the `Returns`
     if(model==null)
     {
        throw new NotSupportedException();
     }
     return model;
  }
}

Тестовый класс

public class MyTest
{
  [Testcase("data")]
  public async Task CanGetById(string value)
  {
      var model=new SomeModel{Name=value};
      var dependency=new Mock<IDependency>();
      dependency.Setup(x=>x.GetByIdAsync(value)).Returns(Task.FromResult(model)).Verifiable(); //i have set up the return of the dependency
      var service=new SomeService(dependency.Object);
      var clone=await service.GetByIdAsync(value);
      dependency.Verify();
  }
}

1 Ответ

2 голосов
/ 13 февраля 2020

Результат будет нулевым, если значение, передаваемое в макетируемый элемент при вызове, не соответствует ожидаемому, когда макет был Установка

Существует также альтернатива использованию ReturnsAsync

Например

[Testcase("data")]
public async Task CanGetById(string value) {
    //Arrange
    var model = new SomeModel { Name = value };
    var dependency = new Mock<IDependency>();
    dependency
        .Setup(x => x.GetByIdAsync(value))
        .ReturnsAsync(model)
        .Verifiable(); 

    var service = new SomeService(dependency.Object);

    //Act
    var clone = await service.GetByIdAsync(value);

    //Assert
    dependency.Verify();
}
...