Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MoQ不设置返回方法_C#_Unit Testing_.net Core_Moq - Fatal编程技术网

C# MoQ不设置返回方法

C# MoQ不设置返回方法,c#,unit-testing,.net-core,moq,C#,Unit Testing,.net Core,Moq,您好,我正在使用MoQ,我正在试图理解为什么我的方法的返回值会被使用。 在下面的示例中,我正在使用模拟接口依赖项创建一个服务。我正在设置接口方法应该返回的内容。 但是,当服务使用模拟依赖项时,返回值为null,而不是我在返回方法中设置的值。 为什么会发生这种情况 型号 public class SomeModel { public string Name {get;set;} } 模拟依赖关系 public interface IDependency { Task<SomeM

您好,我正在使用MoQ,我正在试图理解为什么我的方法的返回值会被使用。 在下面的示例中,我正在使用模拟接口依赖项创建一个服务。我正在设置接口方法应该返回的内容。 但是,当服务使用模拟依赖项时,返回值为null,而不是我在
返回方法中设置的值。
为什么会发生这种情况

型号

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;
  }
}
公共接口独立性
{
任务GetByIdAsync(字符串输入);
}
使用模拟依赖项的服务

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;
  }
}
公共类服务
{
私人独立性;
公共服务(IDependency依赖)
{
依赖性=依赖性;
}
公共异步任务GetByIdAsync(字符串id)
{
var model=wait this.dependency.GetByIdAsync(id);//为什么结果为空,我已经设置了`Returns`
if(model==null)
{
抛出新的NotSupportedException();
}
收益模型;
}
}
测试类

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();
  }
}
公共类MyTest
{
[测试用例(“数据”)]
公共异步任务CanGetById(字符串值)
{
var model=newsomemodel{Name=value};
var dependency=newmock();
dependency.Setup(x=>x.GetByIdAsync(value)).Returns(Task.FromResult(model)).Verifiable();//我已经设置了依赖项的返回
var service=newsomeservice(dependency.Object);
var clone=await service.GetByIdAsync(值);
dependency.Verify();
}
}

只有在调用时传递给模拟成员的值与设置模拟时的预期值不匹配时,结果才会为null

还有一种方法可以替代使用
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();
}
[Testcase(“数据”)]
公共异步任务CanGetById(字符串值){
//安排
var model=newsomemodel{Name=value};
var dependency=newmock();
附属国
.Setup(x=>x.GetByIdAsync(值))
.ReturnsAsync(模型)
.可验证();
var service=newsomeservice(dependency.Object);
//表演
var clone=await service.GetByIdAsync(值);
//断言
dependency.Verify();
}

What is
data
here
var model=wait this.dependency.GetByIdAsync(data)?应该是
id
?很抱歉,我忘了这是一个输入错误。@Bercovicadrian根据显示的测试和被测试的主题,如果设置中使用的值是调用主题时实际传递的值,这应该可以工作。您是对的,我向我的方法发送了一个错误的输入。它工作正常。谢谢!