如何在单元测试中模拟依赖注入对象

2024-01-23

我的项目需要单元测试。我在控制器中使用构造函数依赖注入。当我在单元测试项目中模拟注入的依赖项对象并在测试方法中调用它时。在所有情况下都返回 null。

控制器类:

public class Owner:Controller
{
    private readonly IComRepository repository;
    private readonly DbContext context;
    
    public Owner(IComRepository repository, DbContext context)
    {
      this.repository=repository;
      this.context=context;
    }

    [HttpGet("GetAllTypes")]
    public async Task<IActionResult> GetAllTypes()
    {
      var ownerTypes=repository.GetTypes();
        return Ok(ownerTypes);
    }
}

我的存储库类

public Interface IComRepository
{
    IList<Type> GetTypes();
}
        
public Class ComRepository : IComRepository
{
    private readonly DbContext context;
    public ComRepository(DbContext context)
    {
        this.context=context;
    }
    public IList<Type> GetTypes()
    {
        var allTypes= context.Types.ToList();
        return allTypes;
    }
}

现在我需要测试控制器类中的 GetAllTypes 方法。我的测试课如下:

using moq;
[TestClass]
public Class OwnerTest
{
    public OwnerTest()
    {
        var mockIcomrepo = new Mock<IComRepository>();
        var mockDbcontext = new Mock<Dbcontext>();
        OwnerController owner = new OwnerController(mockDbContext.Object, mockIcomrepo.Object);
    
    }
    [TestMethod]
    public void GetTypes()
    {
        var allTypes= owner.GetAllTypes(); //It's not trigger to my controller
        Assert.AreEqual(5,allTypes.count());
    }
}

我该怎么做?任何人都知道这个问题的答案。


正如 @Nkosi 提到的,你必须使用起订量设置。在构造函数外部定义模拟并在测试类的构造函数中初始化它们。

using moq;
[TestClass]
public Class OwnerTest
{
    private readonly IComRepository _mockRepository;
    private readonly OwnerControler _ownerController;
    
    //your mock data
    private readonly IList<Type> mockData; 

    public OwnerTest()
    {
        _mockRepository= new Mock<IComRepository>();

        _ownerController = new OwnerController(mockDbContext.Object, mockIcomrepo.Object);
        mockData=new IList<Type>{"Data1","Data2","Data3","Data4","Data5"};

    }
    
    //choose better names for testing a method 
    //Naming convention like this MethodName_StateUnderTest_ExpectedResult;
    
    [TestMethod]
    public void GetAllTypes() 
    {
        _mockRepository.Setup(p=>p.GetAllTypes()).Returns(mockData);

        var result= _ownerController.GetAllTypes();
        var okResult=Assert.IsType<OkObjectResult>(result)
        var returnTypes=Assert.IsAssignableFrom<IList<Type>>(okResult.Value);
        Assert.AreEqual(5,returnTypes.count());
    }
}

另外,为什么将 dbcontext 注入到控制器?您的存储库应该依赖于 dbcontext 而不是控制器。

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

如何在单元测试中模拟依赖注入对象 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 单元测试时 Android Studio 2.0 中测试状态终止且没有任何失败消息

    Issue 我昨天在 Ubuntu 上从 1 5 升级到了 Android Studio 2 0 当我在 Android Studio 2 0 中进行单元测试时 即使所有测试都已通过 它也会显示 终止测试 状态 有时它只显示部分测试通过 我
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 如何链接“并行”类层次结构?

    我有一个小的类层次结构 其中每个类对应于某个 TComponent 后代 例如基类 TDefaultFrobber 及其后代 TActionFrobber 和 TMenuItemFrobber 分别对应于 TComponent TCusto
  • 软件/硬件支持的 Android 密钥库的使用以及可能的安全/可用性缺陷

    我目前正在研究在 Android 应用程序中存储 使用密钥的可能性 我发现了尼古拉 埃连科夫的博客 http nelenkov blogspot com关于这个主题非常有帮助 我学到了很多关于 Android 密钥库和一些基于硬件的实现的知
  • Jetty默认是非阻塞的吗?

    请告诉我 Jetty 默认情况下是否是非阻塞 Web 服务器 例如 下面的代码将 Jetty 作为非阻塞 Web 服务器运行 Server server new Server 8080 ServletContextHandler conte
  • “正在缓存中间结果”是什么意思?

    我有一套n向量存储在3 x n matrix z 我发现外部产品使用np einsum 当我使用以下方法计时时 timeit v np einsum i j gt ij z z 我得到了结果 The slowest run took 7 2
  • 如何将子节点附加到特定位置

    如何将 childNode 附加到 javascript 中的特定位置 我想将 childNode 添加到 div 中的第三个位置 它后面还有其他节点需要向后移动 3变成4等 您可以使用 insertBefore https develop
  • 使用 regex 或 ToDicitionary 获取 url

    我怎样才能获取 oauth verifier RN9vtxDFfozW51CSTuls0J4C oauth token 4 2F3uYq 3vYUSjXaFXtS74B laW2V4d RN9vtxDFfozW51CSTuls0J4C an
  • VS-code 中分支名称旁边的 * 是什么意思?

    我不知道为什么会有 在 Visual Studio 代码中我的 git 分支名称旁边 有什么我应该警惕的吗 大多数 shell 着色插件和 IDE 通常使用 对于分支名称表示当前分支有已修改的文件 或者有时仅表示本地存储库有已创建的文件 但
  • 自定义节样式在sectionList REACT NATIVE中

    你知道如何在React native的sectionList组件中制作水平部分 特定的 吗 我想让第二部分水平 我尝试使用 flex 1 和 flexDirection row 修改 renderItem 中的项目样式 但不起作用 任何人都
  • 为什么 Groovy 正则表达式匹配器不能被否定?

    任何人都可以解释以下内容吗 println x x println x x result true true 没有 groovy 中的运算符 这是一个组合 and println x x 相当于 println x x 你需要的是 prin
  • 通用回调

    Extends https stackoverflow com questions 2485058 equivalent to window settimeout for c Related https stackoverflow com
  • 以编程方式更改应用程序的AppPool

    我需要更改某个网站下所有 选定应用程序的应用程序池 我的 IIS 上有所有网站和应用程序池 但我无法更改它们 有任何想法吗 这是我到目前为止所做的 这对我来说看起来很奇怪 因为只有字符串改变 而不是对象 private void Chang
  • 将 Google Closure 模板与 jQuery 结合使用

    我们开始使用 JavaScript 和 HTML5 创建一个应用程序 该应用程序将使用 REST API 来访问服务器资源 利用我们的开发团队已经熟悉的 jQuery 的强大功能和易用性 该应用程序将成为多语言版本 后来我们决定使用 Jav
  • 为 SQL Server 组合“LIKE”和“IN”[重复]

    这个问题在这里已经有答案了 是否可以合并LIKE and IN在 SQL Server 查询中 所以 这个查询 SELECT FROM table WHERE column LIKE IN Text Link Hello World 查找以
  • 如何检查该行是否在每页的第一行?

    我有要打印的数据列表 我想知道是否有任何方法可以查找该行是否是 JasperReports 报告中每个页面的第一行 有一个内置变量名 V PAGE COUNT 第 COUNT页 内置变量 包含生成当前页面时处理的记录数 对于页面上的第一条记
  • git 克隆时远端意外挂断

    My git尝试克隆存储库一段时间后 客户端反复失败并出现以下错误 这里可能有什么问题 Note 我已向 GIT 托管提供商注册了 SSH 密钥 Receiving objects 13 1309 10065 796 00 KiB 6 Ki
  • 尝试使用 Azure SDK 2.5 进行发布会导致 null-ref(对象引用未设置为对象的实例)[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 We upgraded我们来自 SDK 2 4 的 Azure 部署项目至 SDK 2 5 该项目有两个工人角色 将 2 4 项目发布到云服
  • JUnit 测试私有变量? [复制]

    这个问题在这里已经有答案了 我被分配了对一个我从未直接使用 JUnit 进行过工作的类进行单元测试的任务 并且严格禁止更改包中的代码 这通常不是问题 因为我们的大多数单元测试只是为了功能和输入 输出一致性 这可以简单地通过运行例程并检查其返
  • 使用 Lucene SearchAfter 示例

    我正在尝试使用 Lucene 4 8 1 的 SearchAfter 方法在 Web 应用程序中实现搜索结果分页 以前曾问过类似的问题 但那里给出的接受的答案对我不起作用 Stack Overflow问题 Lucene网页分页 https
  • Android 将多个号码传递给短信意图

    我从联系人中获取不同的号码并将它们传递到短信应用程序 我正在使用以下内容 Intent intent new Intent Intent ACTION VIEW Uri parse sms numbers numbers separated
  • 如何在单元测试中模拟依赖注入对象

    我的项目需要单元测试 我在控制器中使用构造函数依赖注入 当我在单元测试项目中模拟注入的依赖项对象并在测试方法中调用它时 在所有情况下都返回 null 控制器类 public class Owner Controller private re