首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在ASP.NET核心测试中使用存根/模拟服务

如何在ASP.NET核心测试中使用存根/模拟服务
EN

Stack Overflow用户
提问于 2017-03-01 16:25:09
回答 3查看 12.7K关注 0票数 16

我想测试一些属于ASP.NET Web Api项目的类。我不需要通过TestServer进行请求-响应集成测试(尽管它们很好),但我想让我的测试尽可能接近“真实的东西”。因此,我希望使用Startup中添加的服务来解决我的类,但在测试的基础上通过stub/mock更改其中的一些(有些测试需要mock,而另一些则不需要)。

在ASP.NET没有内部依赖注入框架的好日子里,这真的很容易做到。所以我只需要调用一个类,将所有的依赖项注册到一个容器中,然后为每个测试创建子容器,将一些依赖项更改为mocks,就这样。

我尝试了这样的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    var host = A.Fake<IHostingEnvironment>();
    var startup = new Startup(host);
    var services = new ServiceCollection();
    //Add stubs here
    startup.ConfigureServices(services);
    var provider = services.BuildServiceProvider();
    provider.GetService<IClientsHandler>();

它似乎是有效的,但我不想为每个测试创建整个启动基础设施。我想创建它一次,然后为每个测试创建“子容器”或“子范围”。有可能吗?基本上,我正在寻找一种在Startup之外修改服务的方法。

EN

回答 3

Stack Overflow用户

发布于 2017-03-10 23:26:27

在通过创建自定义IHttpControllerActivator配置HttpConfiguration时,可以为每个请求创建子范围。

这是针对OWIN的,但是转换到.Net核心应该非常简单:https://gist.github.com/jt000/eef096a2341471856e8a86d06aaec887

重要的部分是在该作用域中创建一个作用域和控制器……

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var scope = _provider.CreateScope();
request.RegisterForDispose(scope);

var controller = scope.ServiceProvider.GetService(controllerType) as IHttpController;

...and正在覆盖默认的IHttpControllerActivator...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config.Services.Replace(typeof (IHttpControllerActivator), new ServiceProviderControllerActivator(parentActivator, provider));

现在,您可以使用作用域依赖项注入通过IServiceProvider添加要创建的控制器……

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddScoped<ValuesController>((sp) => new ValuesController(sp.GetService<ISomeCustomService>()));

为了在您的单元测试中测试您的ValuesController,我建议使用类似Moq框架的东西来模拟您的服务接口中的方法。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var someCustomService = Mock.Of<ISomeCustomService>(s => s.DoSomething() == 3);
var sut = new ValuesController(someCustomService);

var result = sut.Get();

Assert.AreEqual(result, new [] { 3 });
票数 4
EN

Stack Overflow用户

发布于 2018-01-02 16:59:33

如果您希望在xUnit单元测试中使用相同的Web API Core控制器和DI基础设施(在本例中我将其称为集成测试),我建议将TestServerHttpClient上下文移动到实现xUnit IClassFixture的基类中。

在这种情况下,您将使用在真实Web API Core中配置的所有服务和DI来测试API

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TestServerDependent : IClassFixture<TestServerFixture>
{
    private readonly TestServerFixture _fixture;
    public TestServer TestServer => _fixture.Server;
    public HttpClient Client => _fixture.Client;

    public TestServerDependent(TestServerFixture fixture)
    {
        _fixture = fixture;
    }

    protected TService GetService<TService>()
        where TService : class
    {
        return _fixture.GetService<TService>();
    }
}

public class TestServerFixture : IDisposable
{
    public TestServer Server { get; }
    public HttpClient Client { get; }

    public TestServerFixture()
    {
        // UseStaticRegistration is needed to workaround AutoMapper double initialization. Remove if you don't use AutoMapper.
        ServiceCollectionExtensions.UseStaticRegistration = false;

        var hostBuilder = new WebHostBuilder()
            .UseEnvironment("Testing")
            .UseStartup<Startup>();

        Server = new TestServer(hostBuilder);
        Client = Server.CreateClient();
    }

    public void Dispose()
    {
        Server.Dispose();
        Client.Dispose();
    }

    public TService GetService<TService>()
        where TService : class
    {
        return Server?.Host?.Services?.GetService(typeof(TService)) as TService;
    }
}

然后你就可以从这个类派生出来,以这种方式测试控制器的动作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ValueControllerTests : TestServerDependent
{
    public ValueControllerTests(TestServerFixture fixture)
        : base(fixture)
    {
    }

    [Fact]
    public void Returns_Ok_Response_When_Requested()
    {
        var responseMessage = Client.GetAsync("/api/value").Result;
        Assert.Equal(HttpStatusCode.OK, responseMessage.StatusCode);
    }
}

您还可以测试DI服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyServiceTests : TestServerDependent
{
    public MyServiceTests(TestServerFixture fixture)
        : base(fixture)
    {
    }

    [Fact]
    public void ReturnsDataWhenServiceInjected()
    {
        var service = GetService<IMyService>();
        Assert.NotNull(service);

        var data = service.GetData();
        Assert.NotNull(data);
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-03-01 16:51:50

这一切都在documentation中得到了很好的覆盖。

对于集成测试,您可以使用TestServer类并给它一个Startup类(不必是实时启动,也可以是StartupIntegrationTest或startup with Configure{Envrionment Name here} / ConfigureServices{Envrionment Name here}方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var server = new TestServer(new WebHostBuilder()
    .UseStartup<Startup>()
    // this would cause it to use StartupIntegrationTest class or ConfigureServicesIntegrationTest / ConfigureIntegrationTest methods (if existing)
    // rather than Startup, ConfigureServices and Configure 
    .UseEnvironment("IntegrationTest")); 

要访问服务提供商,请执行以下操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var server = new TestServer(new WebHostBuilder()
    .UseStartup<Startup>()
    .UseEnvironment("IntegrationTest")); 
var controller = server.Host.Services.GetService<MyService>();

对于单元测试,您根本不应该使用IServiceCollection/IServiceProvider,只需模拟并注入接口即可。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42536916

复制
相关文章
GPU随机采样速度比较
随机采样问题,不仅仅只是一个统计学/离散数学上的概念,其实在工业领域也都有非常重要的应用价值/潜在应用价值,具体应用场景我们这里就不做赘述。本文重点在于在不同平台上的采样速率,至于另外一个重要的参数检验速率,这里我们先不做评估。因为在Jax中直接支持vmap的操作,而numpy的原生函数大多也支持了向量化的运算,两者更像是同一种算法的不同实现。所以对于检验的场景,两者的速度区别更多的也是在硬件平台上。
DechinPhy
2021/12/10
3610
Excel公式技巧40: 对数据随机排序
有时候,为公平起见,我们会将一组数据随机排序。如下图1所示,在列D中对列C中的数据随机排序。
fanjy
2020/07/29
5.1K0
Excel公式技巧40: 对数据随机排序
关于随机数生成的速度测试
随机数生成有两种方法,一种是主机上生成拷贝到设备上,另一种是直接主机上调用,在设备上生成:下面就是关于这两种方法的速度测试: int main(){ clock_t start,finish; int *d_data; int m = 1000; CUDA_CALL(cudaMalloc((void **)&d_data, m*sizeof(int))); int rand1[1000]; start = clock(); memset(ra
用户1154259
2018/01/17
1K0
矢量函数
一个由三个变量组成的函数w = f(x,y,z)表示如何根据x,y,z来确定w的值。从几何角度更有利于对这个概念的理解:在空间笛卡尔坐标系下取一点,坐标为(x,y,z),函数w = f(x,y,z)告诉我们如何将一个点和一个数联系起来。例如:一个函数T(x,y,z)可以表明空间任意一点的温度。 以上提到的函数f(x,y,z)和T(x,y,z)是标量函数,即在函数T(x,y,z)中给x,y,z赋值得到的结果是温度,温度是标量。矢量函数的一般形式简单明了。在三维空间中的一个矢量函数是一个将每个点(x,y,z)和
fem178
2018/04/08
3.8K0
矢量函数
JS基础测试: 单选 下列随机数公式中正确的是
Math.random() 函数返回一个浮点, 伪随机数在范围[0,1),也就是说,从0(包括0)往上,但是不包括1(排除1),然后可以缩放到所需的范围。
舒克
2019/08/19
1.7K0
【学习】请速度收藏,Excel常用电子表格公式大全
1、查找重复内容公式:=IF(COUNTIF(A:A,A2)>1,”重复”,””)。 2、用出生年月来计算年龄公式:=TRUNC((DAYS360(H6,”2009/8/30″,FALSE))/360,0)。 3、从输入的18位身份证号的出生年月计算公式:=CONCATENATE(MID(E2,7,4),”/”,MID(E2,11,2),”/”,MID(E2,13,2))。 4、从输入的身份证号码内让系统自动提取性别,可以输入以下公式: =IF(LEN(C2)=15,IF(MOD(MID(C2,15
小莹莹
2018/04/18
2.9K0
Excel实战技巧104:使用Excel公式创造一个随机句子
有两种方法可以用来创造随机句:使用Excel365中的动态数组,或者老版本Excel中的常规函数。
fanjy
2021/06/01
1.8K0
【算法】粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
短短的路走走停停
2019/05/13
93.1K8
【算法】粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
用 Wolfram 语言分析随机运动粒子群的角速度分布
1. 该代码可在Mathematica 13.1.0.0(TraditionalForm)下正确运行。
WolframChina
2022/12/02
3590
用 Wolfram 语言分析随机运动粒子群的角速度分布
Excel公式技巧19: 在方形区域内填充不重复的随机整数
本文分享一个基于公式生成n×n随机整数的解决方案,并且每个整数都是唯一的。例如,下图1显示了生成10行10列的不重复随机整数。
fanjy
2020/03/16
1.1K0
pso粒子群优化算法_粒子群算法优化神经网络
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
全栈程序员站长
2022/09/27
7440
矢量数据投影转换
接着上一篇博文中,我们得到了WGS84坐标系下的中国省区图,而我们一般中国地图中使用的是割圆锥投影。
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.8K0
矢量数据的处理
  矢量数据就是点、线、面和注记,不能是栅格,也不能是TIN等数据,矢量数据的处理和分析基本原理如下。
小孙同学
2022/01/17
2.1K0
矢量数据的处理
理解距离矢量路由
1 常用的距离矢量路由:IP RIP、IGRP等等 2 距离矢量算法让路由器向每个邻居周期性的发送完整的路由表,包括每个网络或者子网的信息,相关的度量值等等 3 专业术语: 术语  描述 毒化路由 以前有效的路由,现在变成了无穷大的度量值。 毒性反转 以前因为水平分割不通告,但是现在以无穷大通告的路由 水平分割 接口特性,默认启动,限制每个接口发出的路由更新。对于一个指定的接口 任何出口为这个接口的路由都将不能记录在从这个接口触发的路由更新中 无穷大 路由器失效的路由的度量值。
用户1154259
2018/01/17
8560
干货 | 【算法】粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
这俗话说啊,早起的鸟儿有虫吃,早起的虫儿被鸟吃。而这个鸟抓虫子这个事儿啊,就像当初砸醒牛顿的苹果一样,居然也启发了两位博士,研究出了有用的大道理。那么,今天小编就带领大家,一起来看看这个让人好奇的大道理 -- 粒子群算法,究竟是个什么东西吧。
用户1621951
2019/10/18
2K0
干货 | 【算法】粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
最优化算法之粒子群算法(PSO)
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解. PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。
全栈程序员站长
2022/06/28
2.6K0
最优化算法之粒子群算法(PSO)
计算智能(CI)之粒子群优化算法(PSO)(一)
计算智能(ComputationalIntelligence ,CI)是以生物进化的观点认识和模拟智能。按照这一观点,智能是在生物的遗传、变异、生长以及外部环境的自然选择中产生的。在用进废退、优胜劣汰的过程中,适应度高的结构被保存下来,智能水平也随之提高。因此计算智能就是基于结构演化的智能。计算智能的主要方法有人工神经网络、遗传算法、遗传程序、演化程序、局部搜索、模拟退火等等。这些方法具有以下共同的要素:自适应的结构、随机产生的或指定的初始状态、适应度的评测函数、修改结构的操作、系统状态存储器、终止计算的条
磐创AI
2018/04/24
2.1K0
计算智能(CI)之粒子群优化算法(PSO)(一)
java矢量切片实现
可通过多种方式实现矢量切片的制作,前面讲到了基于postgis数据库、tippecanoe、Qgis等方式,本文讲述基于spring Boot框架下java的实现。
牛老师讲GIS
2023/05/27
7850
矢量数据空间查询
在前面四篇博客中我们主要讲了对于空间矢量数据的属性数据的增删改查,在这篇博文中我们要讲解空间查询–GIS系统很重要的一项功能。空间查询就是根据地物的空间位置进行查询的一种数据检索方式。比如,我们要查询一条河流经的城市;一个公园内的所有路灯;离当前位置最近的公共卫生间等等都属于常用的空间查询。
卡尔曼和玻尔兹曼谁曼
2020/06/16
1.6K0
JAVA NIO Scatter/Gather(矢量IO)
数据从几个缓冲区顺序抽取并沿着通道发送,就好比全部缓冲区全部连接起来放入一个大的缓冲区进行发送,缓冲区本身不具备gather能力。
WindWant
2020/09/11
6400
JAVA NIO Scatter/Gather(矢量IO)

相似问题

矢量推进速度?

65

从位置矢量求出速度矢量

34

随机矢量操纵

14

numpy矢量乘法速度?

11

基于角度和速度寻找速度矢量

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文