当调用扩展方法时,如何使用 Moq 模拟 Autofaq 接口

2024-04-02

使用 C#/Autofac/Moq:我有这样的课程:

public class MyService
{
    private readonly IlifetimeScope _scope;

    public MyService(ILifetimeScope scope)
    {
        _scope = scope;
    }

    public void DoWork()
    {
         var dbContext = _scope.Resolve<IDataContext>();
    }
}

这在运行时起作用。但是,我无法对其进行单元测试,因为我无法模拟 Resolve() 方法。它是一种扩展方法。

能够嘲笑它的最好方法是什么?显而易见的事情是在构造函数中注入 IDataContext 而不是 ILifetimeScope,但由于各种原因我不能。

那么,注入 Func 会起作用吗?

public class MyService
{
    private readonly Func<IDataContext> _dbContext;

    public MyService(Func<IDataContext> dbContext)
    {
        _dbContext = dbContext;
    }

    public void DoWork()
    {
         var ctxt = _dbContext();
         // do stuff
    }
}

如:我可以模拟它,但是 Autofac 会弄清楚如何将正确的参数注入到 ctor 中吗?或者有更好/更简单的方法来做到这一点?


我知道这样做并不理想,但在一些更不常见的情况下可能有必要。

我的情况有点不同。我有一个需要按需创建新上下文的方法,它是一个控制台应用程序,因此它不像核心的 MVC 那样会根据请求开始一个新的生命周期范围。所以我得到了 Autofac/Moq 扩展:http://autofac.readthedocs.io/en/latest/integration/moq.html http://autofac.readthedocs.io/en/latest/integration/moq.html

这将允许您告诉容器为特定接口返回什么实例。

然后你几乎可以这样做:

[Fact]
public void Test()
{
    using (var mock = AutoMock.GetLoose())
    {
        var moqMockMe = new Mock<MockMe>();
        moqMockMe.Setup(s => s.AmIMocked()).Returns("Yes");
        mock.Provide(moqMockMe.Object);

        var lifeTimeScope = mock.Create<ILifetimeScope>();
        using (var scope = lifeTimeScope.BeginLifetimeScope())
        {
            var mockMeInsideScope = scope.Resolve<MockMe>();
            var actual = mockMeInsideScope.AmIMocked();
            Assert.Equal("Yes", actual);
        }
    }
}

public interface MockMe
{
    string AmIMocked();
}

public class MockMeImpl : MockMe
{
    public string AmIMocked()
    {
        return "No";
    }
}

因此,如果您调用的服务有一个开始新的生命周期作用域的方法,您可以模拟结果并使用上面示例中创建的假 ILifeTimeScope 来测试它。

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

当调用扩展方法时,如何使用 Moq 模拟 Autofaq 接口 的相关文章

随机推荐

  • Java 8 中函数式接口的用途是什么?

    我在 Java 8 中遇到了一个新术语 函数式接口 我在使用时只能找到它的一种用途lambda 表达式 Java 8提供了一些内置的函数式接口 如果我们想定义任何函数式接口 那么我们可以使用 FunctionalInterface注解 它将
  • python中装饰器类的解释

    在阅读一些 python 模块时 我遇到了这个装饰器类 this decorator lets me use methods as both static and instance methods class omnimethod obje
  • 有什么方法可以让 git 直接使用 .pac (代理自动配置)脚本吗?

    我的公司网络使用 PAC 脚本 http proxyconf xxx yy ss proxy pac http proxyconf xxx yy ss proxy pac 在 git config 命令中使用 PAC 脚本不起作用 git
  • 使用 ECB 模式的 CryptoJS AES 加密使用相同的参数会产生不同的结果

    正如本文中提到的answer https stackoverflow com a 47096284 940030 我可以使用 ECB 模式将转换后的值反转回纯文本 而不仅仅是将其与另一个哈希值进行比较 但是 使用以下代码片段 const x
  • 排序链表最简单的方法

    我正在尝试为链表编写非常基本的排序方法 我遇到了未处理的异常 我犯了什么错误 这是我的代码 struct LinkedNode structure for linked list int data struct LinkedNode nex
  • 以分类变量(枚举)作为输入的神经网络

    我正在尝试使用神经网络解决一些机器学习问题 主要是使用NEAT进化 增强拓扑的神经进化 我的一些输入变量是连续的 但其中一些具有分类性质 例如 物种 狮子 豹子 老虎 美洲虎 行业 医疗保健 保险 金融 IT 广告 起初 我想通过将类别映射
  • 如何在 Magento 中通过订单 ID 获取发货增量 ID

    大家好 有人可以告诉我如何在 Magento 中通过订单 id 获取发货增量 id 吗 我需要这个 因为我使用外部 php 文件向货件添加跟踪信息 并且它需要货件 ID 谢谢你的帮助 我正在使用下面的代码添加跟踪信息 shipmentInc
  • 如果我需要 mysql 视图和 nextJS 中的存储过程,prisma 有什么好处

    我开始学习 prisma 来替换我的 nextJS 应用程序中的 nodejs 后端 似乎 prisma 不适用于在我的 mysql 数据库中创建的视图和存储过程 如果我不能只使用视图和存储过程 那么切换到 prisma 是否还有意义 这允
  • Ember.js:从集合中检索随机元素

    我有这样的路线 App RandomThingRoute Ember Route extend model function return App Thing find random 这需要一趟 things randomAPI端点 我在控
  • 适用于 Windows 的 MinGW gcj?

    我找不到 MinGW 的 gcj 二进制文件的链接 它没有出现在 MinGW get 列表中 并且我找不到二进制文件the site http www mingw org wiki Compile with gcj 它真的存在吗 我在哪里可
  • C 编译错误:数组类型具有不完整的元素类型

    include
  • 将对象类定义导入到 Active Directory (AD LDS)

    我在将对象类定义从 OpenDS 迁移到 Active Directory 时陷入困境 我已经成功迁移了some定义 并且可以使用我的 Java 应用程序读取 写入 AD 但现在我陷入困境 在我的 OpenDS 模式描述中 我有这样的内容
  • 无法使用“writes”将通用案例类转换为 json

    我有一个类 我希望能够将其转换为 json case class Page T items Seq T pageIndex Int pageSize Int totalCount Long object Page implicit val
  • 使用 JQuery 以重力形式获取价值

    我正在尝试向我的重力形式 WordPress 添加一个公式 其中包括指数 我无法使用内置计算器 因为没有指数函数 它基本上是一个贷款计算器 r 率 form id 4 12 p 贷款金额 form id 1 D 持续时间 form id 2
  • WPF:截取屏幕截图并保存[重复]

    这个问题在这里已经有答案了 我是 WPF 应用程序的新手 我尝试四处寻找是否可以找到适用于此的东西 但到目前为止我还没有找到任何有用的东西 我想这是因为其中大部分都已经过时了 我想截取整个桌面 即所有显示器 的屏幕截图并将其另存为 jpg当
  • Javascript for 循环缺少中间部分:错误还是高级?

    我正在为工作项目调试另一位开发人员的 Javascript 我可能是一名中级 Javascript 开发人员 在美好的一天 我遇到了一个似乎已损坏的 for 循环 for i 0 i 谁能告诉我这是否确实是一个错误 或者在某些情况下这是否是
  • 如何像签署程序集一样签署 ZIP 文件?

    我有一个包含签名的 Net 程序集的 ZIP 文件 是否可以通过工具来签名而不是代码 而是包含这些程序集的 ZIP 文件 我希望能够在代码方面处理这个问题 比如 if myzipfile IsSignedBy name DezipFile
  • 为了性能而将python与c集成是否合理?

    我喜欢使用 python 来做几乎所有的事情 并且总是清楚地意识到 如果由于某种原因我要在 python 代码中找到瓶颈 由于 python 的限制 我总是可以使用集成到我的代码中的 C 脚本 但是 当我开始读一本guide http ww
  • Apache Spark 中的 reduce() 与 Fold()

    有什么区别reduce vs fold关于它们的技术实现 我知道他们的签名不同fold接受添加到每个分区输出的附加参数 即初始值 有人可以讲述这两个操作的用例吗 在考虑使用 0 的情况下哪个会表现更好fold 提前致谢 就性能而言 没有任何
  • 当调用扩展方法时,如何使用 Moq 模拟 Autofaq 接口

    使用 C Autofac Moq 我有这样的课程 public class MyService private readonly IlifetimeScope scope public MyService ILifetimeScope sc