Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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/0/asp.net-core/3.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# 伪造来自测试的GetAsync调用_C#_Asp.net Core_.net Core_Integration Testing - Fatal编程技术网

C# 伪造来自测试的GetAsync调用

C# 伪造来自测试的GetAsync调用,c#,asp.net-core,.net-core,integration-testing,C#,Asp.net Core,.net Core,Integration Testing,问题是我想在CarService类中伪造GetAsync(intid)方法的结果 所以我试过了 using (var response = await _client.GetAsync($"/api/car/{id}")) { //... } 更新: public class CarService: ICarService { private readonly CarDbContext _carDbContext; public CarService

问题是我想在
CarService
类中伪造
GetAsync(intid)
方法的结果

所以我试过了

using (var response = await _client.GetAsync($"/api/car/{id}"))
{
    //...         
}
更新:

public class CarService: ICarService {
    private readonly CarDbContext _carDbContext;

    public CarService(CarDbContext carDbContext)
    {
        _carDbContext = carDbContext;
    }

    public async Task<Car> GetAsync(int id)
    {
        return await _carDbContext.Cars.FindAsync(id);
    }
}
private readonly ICarService\u carService;
公共车辆控制员(ICarService车辆服务)
{
_carService=carService;
}
公共异步任务Get([FromRoute]int id)
{
var car=await\u carService.GetAsync(id);
}
更新2:

private readonly ICarService _carService;

public CarController(ICarService carService)
{
    _carService = carService;
}

public async Task<IActionResult> Get([FromRoute] int id)
{
    var car = await _carService.GetAsync(id);
}
公共类启动
{
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(options=>{options.UseSqlServer(Configuration.GetConnectionString(“Db”);});
services.AddTransient();
}
}
公共类CarService:ICarService
{
私人只读卡德文(CarDbContext);;
公共联系服务(CarDbContext CarDbContext)
{
_carDbContext=carDbContext;
}
公共异步任务GetAsync(int ownerId)
{
var owner=wait_carDbContext.owner.FindAsync(ownerId);
返回所有者。汽车;
}
}
更新3:

public class Startup
{
   public void ConfigureServices(IServiceCollection services)
   {
       services.AddDbContext<CarDbContext>(options => { options.UseSqlServer(Configuration.GetConnectionString("Db")); });
       services.AddTransient<ICarService, CarService>();
   }
}

public class CarService : ICarService
{
    private readonly CarDbContext _carDbContext;

    public ContactService(CarDbContext carDbContext)
    {
       _carDbContext= carDbContext;
    }
    public async Task<Owner> GetAsync(int ownerId)
    {
       var owner = await _carDbContext.Owners.FindAsync(ownerId);
       return owner.Car;            
    }
}
private readonly TestServer\u服务器;
公共设施()
{
var dbContextOptions=new DbContextOptionsBuilder()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.选择;
var mockContext=new Mock(dbContextOptions);
var mockOwnerSet=new Mock();
var mockCarSet=new Mock();
Setup(m=>m.Owners).Returns(mockOwnerSet.Object);
Setup(m=>m.Cars).Returns(mockCarSet.Object);
var carService=新的carService(mockContext.Object);
_服务器=新的TestServer(新的WebHostBuilder()
.ConfigureAppConfiguration((上下文,conf)=>
{
conf.AddJsonFile(@Directory.GetCurrentDirectory()+“./appsettings.json”);
}).UseStartup()
.ConfigureServices(服务=>
{
services.AddDbContext(options=>options.UseInMemoryDatabase(“Test”);
AddScoped(=>carService);
})
);
Client=_server.CreateClient();
}   

将测试服务器配置为使用模拟服务

private readonly TestServer _server;
public Fixture()
{
    var dbContextOptions = new DbContextOptionsBuilder<CarDbContext>()
                    .UseInMemoryDatabase(Guid.NewGuid().ToString())
                    .Options;

    var mockContext = new Mock<CarDbContext>(dbContextOptions);
    var mockOwnerSet = new Mock<DbSet<Owner>>();
    var mockCarSet = new Mock<DbSet<Car>>();
    mockContext.Setup(m => m.Owners).Returns(mockOwnerSet.Object);
    mockContext.Setup(m => m.Cars).Returns(mockCarSet.Object);          

    var carService = new CarService(mockContext.Object);

    _server = new TestServer(new WebHostBuilder()
        .ConfigureAppConfiguration((context, conf) =>
        {
            conf.AddJsonFile(@Directory.GetCurrentDirectory() + "../appsettings.json");
        }).UseStartup<Startup>()
            .ConfigureServices(services =>
            {
                services.AddDbContext<CarDbContext>(options => options.UseInMemoryDatabase("Test"));
                services.AddScoped<ICarService>(_ => carService);
            })
        );

    Client = _server.CreateClient();    
}   
public Fixture(){
Car myCarObject=/…为简洁起见省略
var myCarMockService=new Mock();
myCarMockService
.Setup(x=>x.GetAsync(It.IsAny()))
.ReturnsAsync(myCarObject);
_服务器=新的TestServer(新的WebHostBuilder()
.UseStartup()
.ConfigureTestServices(服务=>{
var serviceDescriptor=services.FirstOrDefault(descriptor=>descriptor.ServiceType==typeof(ICarService));
如果(serviceDescriptor!=null)服务。删除(serviceDescriptor);

services.AddTransient(=>myCarMockService.Object);//您的要求有点不清楚。您是否也可以共享
MyService
实现?您可以模拟HTTPClient@Johnny,我使用服务实现更新了q。如果您使用
HttpClient
调用API,这意味着您正在访问实际的服务。如果您不打算访问实际的服务,则y您应该只为
CarService
编写单元测试。@user1672994我确实想点击CarService,我只是想从它的GetAsync方法中伪造结果。感谢您的努力,我确信这会起作用,但我仍然从return wait _carDbContext.Cars.FindAsync(id)中得到空值;否此示例替换整个car服务。它应该调用实际的实现类。我假设ICarservice被注入控制器?控制器应该使用模拟的ICarservice这是正确的,我的服务使用DI,但我仍然从_carDbContext.Cars.FindAsync(id)获取null。看起来我也需要模拟dbContext?(如果是这样,我完全困惑:)@user1765862检查更新的答案。注意
ConfigureTestServices
public class Startup
{
   public void ConfigureServices(IServiceCollection services)
   {
       services.AddDbContext<CarDbContext>(options => { options.UseSqlServer(Configuration.GetConnectionString("Db")); });
       services.AddTransient<ICarService, CarService>();
   }
}

public class CarService : ICarService
{
    private readonly CarDbContext _carDbContext;

    public ContactService(CarDbContext carDbContext)
    {
       _carDbContext= carDbContext;
    }
    public async Task<Owner> GetAsync(int ownerId)
    {
       var owner = await _carDbContext.Owners.FindAsync(ownerId);
       return owner.Car;            
    }
}
private readonly TestServer _server;
public Fixture()
{
    var dbContextOptions = new DbContextOptionsBuilder<CarDbContext>()
                    .UseInMemoryDatabase(Guid.NewGuid().ToString())
                    .Options;

    var mockContext = new Mock<CarDbContext>(dbContextOptions);
    var mockOwnerSet = new Mock<DbSet<Owner>>();
    var mockCarSet = new Mock<DbSet<Car>>();
    mockContext.Setup(m => m.Owners).Returns(mockOwnerSet.Object);
    mockContext.Setup(m => m.Cars).Returns(mockCarSet.Object);          

    var carService = new CarService(mockContext.Object);

    _server = new TestServer(new WebHostBuilder()
        .ConfigureAppConfiguration((context, conf) =>
        {
            conf.AddJsonFile(@Directory.GetCurrentDirectory() + "../appsettings.json");
        }).UseStartup<Startup>()
            .ConfigureServices(services =>
            {
                services.AddDbContext<CarDbContext>(options => options.UseInMemoryDatabase("Test"));
                services.AddScoped<ICarService>(_ => carService);
            })
        );

    Client = _server.CreateClient();    
}   
public Fixture() {

    Car myCarObject = //... omitted for brevity
    var myCarMockService = new Mock<ICarService>();
    myCarMockService
        .Setup(x => x.GetAsync(It.IsAny<int>()))
        .ReturnsAsync(myCarObject);

    _server = new TestServer(new WebHostBuilder()
        .UseStartup<Startup>()
        .ConfigureTestServices(services => {
            var serviceDescriptor = services.FirstOrDefault(descriptor => descriptor.ServiceType == typeof(ICarService));
            if (serviceDescriptor != null) services.Remove(serviceDescriptor);
            services.AddTransient<ICarService>(_ => myCarMockService.Object); // <-- NOTE
        })
    );

    Client = _server.CreateClient();
}