使用 Autofac 进行 XUnit 测试构造函数依赖注入

2024-02-03

我正在使用 Autofac 实现 Xunit,我可以通过以下代码使其工作:

using (var scoped = DbFixture.Container.Resolve<UserReponsitory>())
{
    var result = (scoped.GetAll()).ToList().Count();
    Assert.Equal(2, result);
}

但我想注入 UserReponsitory 来测试方法而不是使用DbFixture.Container.Resolve。是否可以使下面的代码工作?
单元测试1.cs

namespace XUnitTestPro
{
    public class UnitTest1:IClassFixture<DbFixture>
    {
        private IUserReponsitory _userReponsitory;
        public UnitTest1(IUserReponsitory userReponsitory)
        {
            _userReponsitory = userReponsitory;
        }
        [Fact]
        public void Test1()
        {
            //using (var scoped = DbFixture.Container.Resolve<UserReponsitory>())
            //{
            //    var result = (scoped.GetAll()).ToList().Count();
            //    Assert.Equal(2, result);
            //}
            var result = _userReponsitory.GetAll().ToList().Count();
            Assert.Equal(2, result);
        }
    }
}

数据库夹具.cs

namespace XUnitTestPro
{
    public class DbFixture
    {
        public static IContainer Container { get; set; }

        public DbFixture()
        {
            var builder = new ContainerBuilder();
            var option = new DbContextOptionsBuilder<UserContext>().UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Database=EFProject;Trusted_Connection=True;MultipleActiveResultSets=true").Options;
            UserContext context = new UserContext(option);
            builder.RegisterInstance(context).As<UserContext>();

            builder.RegisterType<UserReponsitory>().AsSelf().As<IUserReponsitory>();

            builder.RegisterAssemblyTypes(typeof(DbFixture).GetTypeInfo().Assembly);

            Container = builder.Build();

        }
    }
}

目前,我收到以下错误,它似乎与IClassFixture<DbFixture> and public UnitTest1(IUserReponsitory userReponsitory)是不同的。

消息:以下构造函数参数不匹配 夹具数据:IUserReponsitory userReponsitory

有没有什么方法可以在不调用的情况下实现以下代码DbFixture.Container.Resolve这类似于注入 MVC 控制器?

public UnitTest1(IUserReponsitory userReponsitory)
{
    _userReponsitory = userReponsitory;
}

换句话说,我如何依赖注入单元测试类?
任何帮助,将不胜感激。


xUnit 中的依赖注入支持有点有限。

当你实施IClassFixture<DbFixture>接口,那么 xUnit 期望one DbFixture范围在它的构造函数中,参数的类型取决于T in IClassFixture<T>.

话虽这么说,当你实施IClassFixture<DbFixture>你的构造函数必须看起来像public UnitTest1(DbFixture)。但是你有IUserRepository,所以 xUnit 不知道要在那里注入什么。

您还可以实施多个IClassFixture<T>类型,但您可以使用每个T每个测试班仅一次。

来自官方关于共享上下文的 xUnit 文档 https://xunit.github.io/docs/shared-context.html (IClassFixture<T>):

重要的提示:xUnit.net 使用接口 IClassFixture 的存在来知道您想要创建和清理类固定装置。无论您是否将类的实例作为构造函数参数,它都会执行此操作。同样,如果您添加构造函数参数但忘记添加接口,xUnit.net 会让您知道它不知道如何满足构造函数参数。

Update

仍然可以使用 IoC 容器来解决它,只是不能使用构造函数注入。

public class DbFixture
{
    public IContainer Container { get; private set; }

    public DbFixture()
    {
        var builder = new ContainerBuilder();
        var option = new DbContextOptionsBuilder<UserContext>().UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Database=EFProject;Trusted_Connection=True;MultipleActiveResultSets=true").Options;
        UserContext context = new UserContext(option);
        builder.RegisterInstance(context).As<UserContext>();

        builder.RegisterType<UserReponsitory>().AsSelf().As<IUserReponsitory>();

        builder.RegisterAssemblyTypes(typeof(DbFixture).GetTypeInfo().Assembly);

        Container = builder.Build();
    }
}

public class UnitTest1:IClassFixture<DbFixture>
{
    private IUserReponsitory _userReponsitory;
    public UnitTest1(DbFixture fixture)
    {
        // resolve it here
        _userReponsitory = fixture.Container.Resolve<IUserRepository>();
    }

    [Fact]
    public void Test1()
    {
        //using (var scoped = DbFixture.Container.Resolve<UserReponsitory>())
        //{
        //    var result = (scoped.GetAll()).ToList().Count();
        //    Assert.Equal(2, result);
        //}
        var result = _userReponsitory.GetAll().ToList().Count();
        Assert.Equal(2, result);
    }
}

然而,问题是这样的使用方法好吗?不确定你想要达到什么目标,但如果你想要的话unit测试,那么你根本不必使用 IoC 容器或具体类,只需模拟和你正在测试的类型。

如果你想在 ASP.NET Core MVC / WebApi 上进行集成测试,那么你应该使用TestServer类,它使用您已经配置的所有 IoC 启动整个应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Autofac 进行 XUnit 测试构造函数依赖注入 的相关文章

随机推荐

  • Azure 函数无法启动 - “未响应端口 X 上的 HTTP ping”(Docker/VNet)

    我真的很难弄清楚如何设置使用 Docker 容器映像并连接到 VNet 的 Azure Function 我在任何地方都找不到此设置的任何示例 我遇到的主要问题是 在我的容器启动并运行后 它似乎没有响应底层框架用于确定该功能是否启动并运行的
  • codechef 和 spoj 问题中使用的 modulo 10^9+7 有何意义?

    我正在研究一个问题 http www codechef com SEPT14 problems CHEFLR它需要输出为 对于每行输出答案模 10 9 7 为什么是模 10 9 7包含在问题中吗 其意义何在 我不是在寻找问题的解决方案 仅该
  • 进度条与文件解压

    我正在尝试更新progress bar将文件解压缩到 SD 卡中 我的解压工作正常 但是progress bar没有出现 这是我在 mainactivity 中的代码 private ProgressBar bar Override pub
  • ORM 解决方案(JPA;Hibernate)与 JDBC

    我需要能够以每 5 秒至少 8000 个对象的一致速率在内存 HSQL 数据库中插入 更新对象 我在 Spring Hibernate JPA 和纯 JDBC 之间做了一些性能对比测试 我发现使用 HSQL 的性能有显着差异 使用 Spri
  • Silverlight:FrameworkElement.FindName() 在浏览器窗口中不“可见”时找不到控件

    我遇到一个问题 我使用 FrameworkElement 对象的 FindName 方法来搜索该元素的子控件 我注意到了一些有趣的行为 但似乎无法弄清楚 如果用户滚动浏览器窗口 使得控件本身在窗口框架的上下文中不再明显显示 则 FindNa
  • “let”类陷入无限循环

    请原谅代码中的任何愚蠢错误 因为这是我第一次尝试使用类 而且我在网上找不到任何真正将其放入其中的教程 really对于像我这样的傻瓜来说 简单的术语 我尽力遵循 MS 指南 https msdn microsoft com en us li
  • c:forEach 在 tomcat 7 中不起作用

    我使用创建了简单的页面c forEach标签 它在 tomcat 6 中工作 但是not working tomcat 7 使用 JSF 2 0 开发简单的 Web 应用程序 我在 tomcat 6 中运行我的代码 它可以工作 我部署在 t
  • 为什么 Array.Copy 支持长参数

    来自MSDN http msdn microsoft com en us library btfeahds VS 80 aspx 参数 源数组 包含数据的数组 复制 目的地数组 接收数据的数组 长度 一个 64 位整数 表示 要复制的元素数
  • 使用数据源将文本添加到组合框

    我有一个 vaadin 组合框 里面装有容器数据源 setContainerDataSource container 我现在想在结果列表中的某处插入静态文本 例如 一个组合框充满了一个容器 结果列表中弹出的第一个条目是某种标题 Person
  • 从 python 字典列表中选择单个字段

    假设我有一个字典列表 如下所示 dictionList 1 Type Cat Legs 4 2 Type Dog Legs 4 3 Type Bird Legs 2 使用 for 循环 我想迭代列表 直到捕获带有 a 的字典Type场等于
  • CSS:增加上边距

    我正在尝试以楼梯类型的方式错开 div 类 所以它看起来像这样 1 2 3 4 编辑 我想更改上边距 以便 process div 的每个位置都低于之前的位置 我让它们浮动 这样它们就可以并排坐着 但我也希望每个 div 都比上一个更低 我
  • FastText 使用预先训练的词向量进行文本分类

    我正在研究文本分类问题 也就是说 给定一些文本 我需要为其分配某些给定的标签 我尝试过使用 Facebook 的快速文本库 它有两个我感兴趣的实用程序 A 带有预训练模型的词向量 B 文本分类实用程序 然而 这些似乎是完全独立的工具 因为我
  • Overpass api 来查找坐标的速度限制?

    我收到车辆的坐标 我需要找出该车辆所在道路的速度限制 我知道你可以找到某个有界框的最大速度 如下所示 www overpass api de api xapi 最大速度 bbox 5 6283473 50 5348043 5 6285261
  • 通过 JQuery 选择 select 中的选项

    我有一个包含以下选项的选择
  • 启用对非公共 Google Cloud Function 的令牌访问

    我想部署一个没有公共访问权限的 Google Cloud Function 服务帐户应该能够以最少的权限调用该功能 由外部服务器使用 我已经创建了一个服务帐户 添加了绑定并下载了密钥 gcloud iam service accounts
  • Puppeteer 启动器错误结果未定义

    在 Windows 上测试我的项目后 我将其部署到基于 Ubuntu 的虚拟机上 这就是 Puppeteer 行为让我感到困惑的地方 我确实安装了所有必需的依赖项 但我有一种感觉 我的错误不一定是由于缺乏依赖项以及更多有关配置问题而引起的
  • PyCharm:为什么只显示退出代码行?

    例如 运行以下代码行 print Hello world My name is Enkouyami 只输出这个 Process finished with exit code 0 让它显示该文本的唯一方法是转到 python 控制台 我的
  • 在 Ubuntu 18.x 和 R 3.4.4/3.5.1 上安装 tidyverse

    我尝试安装 tidyverse 以及组成 tidyverse 的软件包 并得到以下输出 gt install packages tidyverse dependencies TRUE type source Installing packa
  • 在PHP应用程序中以安全的方式存储MYSQL的密码

    我有一个从代码连接到数据库的 php 应用程序 我想知道存储这些凭据的安全方法是什么 这是一个Linux服务器 编辑 我只想听到一些知情的意见 以便自己获得知情的意见 以便与我的团队讨论 我反对加密任何密码 但我的团队并不相信 我认为如果密
  • 使用 Autofac 进行 XUnit 测试构造函数依赖注入

    我正在使用 Autofac 实现 Xunit 我可以通过以下代码使其工作 using var scoped DbFixture Container Resolve