AutoFixture:模拟方法不返回冻结实例

2023-11-21

我正在尝试编写这个简单的测试:

var fixture = new Fixture().Customize(new AutoMoqCustomization());

var postProcessingAction = fixture.Freeze<Mock<IPostProcessingAction>>();
var postProcessor = fixture.Freeze<PostProcessor>();

postProcessor.Process("", "");

postProcessingAction.Verify(action => action.Do());

The Verify检查失败。
postProcessor.Process 的代码是

public void Process(string resultFilePath, string jobId)
{
    IPostProcessingAction postProcessingAction =
        postProcessingActionReader
            .CreatePostProcessingActionFromJobResultXml(resultFilePath);

    postProcessingAction.Do();
}

postProcessingActionReader是通过构造函数初始化的接口字段。

我期望测试能够通过,但它失败了,事实证明是IPostProessingAction从返回的CreatePostProcessingActionFromJobResultXml方法与返回的实例不同fixture.Freeze<>.

我的期望是,在冻结这个 Mock 对象后,它会注入底层的模拟IPostProcessingAction在每个需要的地方提供接口,并使所有模拟方法返回IPostProcessingAction返回同一个对象。

我对模拟方法的返回值的期望是否不正确? 有没有办法改变这种行为,以便模拟方法返回相同的冻结实例?


你需要Freeze the IPostProcessingActionReader成分。

以下测试将通过:

[Fact]
public void Test()
{
    var fixture = new Fixture()
        .Customize(new AutoMoqCustomization());

    var postProcessingActionMock = new Mock<IPostProcessingAction>();

    var postProcessingActionReaderMock = fixture
        .Freeze<Mock<IPostProcessingActionReader>>();

    postProcessingActionReaderMock
        .Setup(x => x.CreatePostProcessingActionFromJobResultXml(
            It.IsAny<string>()))
        .Returns(postProcessingActionMock.Object);

    var postProcessor = fixture.CreateAnonymous<PostProcessor>();
    postProcessor.Process("", "");

    postProcessingActionMock.Verify(action => action.Do());
}

假设类型定义为:

public interface IPostProcessingAction
{
    void Do();
}

public class PostProcessor
{
    private readonly IPostProcessingActionReader actionReader;

    public PostProcessor(IPostProcessingActionReader actionReader)
    {
        if (actionReader == null)
            throw new ArgumentNullException("actionReader");

        this.actionReader = actionReader;
    }

    public void Process(string resultFilePath, string jobId)
    {
        IPostProcessingAction postProcessingAction = this.actionReader
            .CreatePostProcessingActionFromJobResultXml(resultFilePath);

        postProcessingAction.Do();
    }
}

public interface IPostProcessingActionReader
{
    IPostProcessingAction CreatePostProcessingActionFromJobResultXml(
        string resultFilePath);
}

如果您使用 AutoFixture声明式地与 xUnit.net扩大测试可以进一步简化:

[Theory, AutoMoqData]
public void Test(
    [Frozen]Mock<IPostProcessingActionReader> readerMock,
    Mock<IPostProcessingAction> postProcessingActionMock,
    PostProcessor postProcessor)
{
    readerMock
        .Setup(x => x.CreatePostProcessingActionFromJobResultXml(
            It.IsAny<string>()))
        .Returns(postProcessingActionMock.Object);

    postProcessor.Process("", "");

    postProcessingActionMock.Verify(action => action.Do());
}

The AutoMoqDataAttribute定义为:

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

AutoFixture:模拟方法不返回冻结实例 的相关文章

  • 如何使用 Moq 模拟 SqlDataReader - 更新

    我是最小起订量和设置模拟的新手 所以我可以得到一些帮助 如何使用 Moq 模拟 SqlDataReader Update 经过进一步测试 这是我目前所拥有的 private IDataReader MockIDataReader var m
  • 使用 NSubstitute 模拟表达式

    我有一个包含以下方法签名的接口 TResult GetValue
  • 测试在最小起订量中多次调用的方法

    我有一个像这样的界面 Interface IWriteFile string FileName get set void Open void WriteData string dataToWrite void Close 我想测试一个将使用
  • 为什么我不能用 Moq 模拟 MouseButtonEventArgs.GetPosition()?

    我试图嘲笑MouseButtonEventArgs GetPosition 与 Moq 但我不断收到此错误 System ArgumentException Invalid setup on a non overridable member
  • 如何在使用 Moq 的测试中引发事件?

    以下是父类中的部分代码实现 handler FooUpdateDelegate FooUpdate OnFooUpdate protected abstract void OnFooUpdate ref IBoo boo string s
  • Autofixture构造函数注入延迟加载

    我在单元测试中使用自动装置 它作为自动模拟器的工作方式非常棒 但是 当我将延迟加载的对象注入到我的类中时 我遇到了问题 例如 public class MyClass IMyClass private Lazy
  • AutoFixture 和私有财产

    我可以指导吗汽车夹具 https github com AutoFixture还可以填充私有属性 并用特定属性进行注释 例如Ninject Inject 所有类别中 来源似乎只扫描公共属性 1 https github com AutoFi
  • 模拟授权属性的存在

    我想知道如何在 MVC3 中模拟使用 Authorize 属性装饰控制器 我正在使用自定义会员资格提供商 我想测试一个控制器是否已用该属性装饰 并且您已获得授权 以及如果您没有获得授权 会发生什么情况 我正在使用起订量 这方面有什么好的建议
  • 如何模拟 xml 进行单元测试?

    我需要对这个 GetData 方法进行单元测试 public MessageResponse GetData XmlElement requestElement MessageResponse MsgResponse new Message
  • 使用 Moq 模拟存储库

    为了模拟存储库 我使用下面的代码 我不明白为什么变量empl总是null 你知道我错过了什么吗 Thanks TestMethod public void Test var employee new Employee EmployeeID
  • 使用 Moq 对 LINQ to SQL CRUD 操作进行单元测试

    我已经查看了其他问题 但没有什么真正符合我正在寻找的内容 主要是因为我不能 100 确定我正在寻找什么 基本上我现在正在开发一个新项目 我已经为数据库实体创建了抽象层并将 DAC 设置为存储库 我想使用 Mock 对象对此进行单元测试 但是
  • 在起订量中重置模拟验证?

    设置如下 public interface IFoo void Fizz Test public void A var foo new Mock
  • 在 Moq 中模拟通用方法而不指定 T

    我有一个接口 其方法如下 public interface IRepo IA
  • 使用假 DbContext 和 Autofixture 以及 Moq 进行测试

    所以请遵循这个例子 example http romiller com 2012 02 14 testing with a fake dbcontext 以及如何制作一个假的 DBContext 来测试我的测试 使用这个工作正常 Test
  • 在模拟的 HttpContextBase 上设置属性

    我正在开发一个 ASP NET MVC 应用程序 并尝试针对控制器操作编写一些单元测试 其中一些操作 HttpContext 上的属性 例如 Session Request Cookies Response Cookies 等 在弄清楚如何
  • 如何Moq Fluent接口/链方法

    我正在使用 Daniel Cazzulino 的 moq 框架 kzu 版本 4 10 1 我想要最小起订量 这样我就可以测试功能的特定部分 下面是我可以提取的代码的简单版本 流畅 链方法的设计是为了让您可以通过 Id 获取对象 并在需要时
  • Moq-ing 类或接口有什么区别?

    我一直在使用moq http code google com p moq 在我的单元测试中模拟对象 我在关于最小起订量的网站上看到它能够模拟类和接口 有一天 我与我的一位同事进行了讨论 他们表示没有理由模拟类 我应该只模拟接口 我对此并没有
  • 如何创建始终在 AutoFixture 中设置预定义值的类列表?

    如何创建始终在 AutoFixture 中设置特定预定义值的类集合 Fixture Register
  • 如何使用 Moq 模拟 Web 服务调用?

    The using下面点击了我不想实际点击的外部资源 我想测试someResult以及使用它的代码 但每次我运行单元测试时 该代码仍然尝试访问真正的 Web 服务 如何使用最小起订量来伪造对 Web 服务的真实调用 但不模拟使用中的其余代码
  • 这可以用 Moq 来嘲笑吗?

    我正在努力模拟一些外部依赖项 并且在一个第三方类中遇到了麻烦 该类在其构造函数中接收另一个第三方类的实例 希望 SO 社区能给我一些指导 我想创建一个模拟实例SomeRelatedLibraryClass它的构造函数接受一个模拟实例Some

随机推荐

  • 从 JSTL 读取属性文件

    我正在尝试使用 taglib 读取 JSTL 形式的 属性文件 但我无法访问它 我已在 web xml 中正确找到了 tld 文件 我确信这一点
  • 是否有相当于 Facebook Access Token linter/debugger 的 API?

    是否有一个与以下功能等效的图形 APIFacebook 访问令牌 linter 调试器我可以通过编程方式调用吗 短绒很好 它告诉您有关您拥有的令牌的各种很酷的信息 例如授予的权限 我可以通过me permissions 问题和到期日期 应用
  • 如何根据正在执行的目标激活配置文件

    当我从命令行执行某些目标时 我想 自动 激活配置文件 例如 我现在在做什么 mvn appengine devserver Pdevelopment mvn appengine update Pproduction 基本上我想在运行 dev
  • 访问 JSON 元素

    我从 URL 获取天气信息 weather urllib2 urlopen url wjson weather read 我得到的是 data current condition cloudcover 0 humidity 54 obser
  • 如何使用现有自定义主题隐藏 XML 中活动的标题栏

    我想隐藏某些活动的标题栏 问题是我对所有活动应用了一种样式 因此我不能简单地将主题设置为 android style Theme NoTitleBar 使用无标题栏主题作为我的样式的父项将从我的所有活动中删除标题栏 我可以在某处设置无标题样
  • C++ STL 线程函子的正确使用

    我在理解 C STL 中函数对象作为线程例程的正确用法时遇到一些困难 根据我的理解 函子的好处之一是对象实例可以维护状态 有时我希望一个或多个线程运行一些例程并计算一些结果 然后 在加入线程后 我从对象中查询这些结果 我正在尝试对 C ST
  • python中的十六进制字符串变量到十六进制值的转换

    我有一个名为 hex string 的变量 该值可能是 01234567 现在我想从此变量获取一个十六进制值 即 0x01234567 而不是字符串类型 该变量的值可能会改变 所以我需要一个通用的转换方法 我认为您可能混淆了数字及其表示形式
  • IdentityServer4 IdentityServer3.AccessTokenValidation

    祝大家新年快乐 我配置了 IdentityServer4 并且可以成功进行 ASP net Core Web api 调用 但对于 ASP NET Framework 4 5 2 Web api 我收到来自 NET Framework We
  • 检测被点击的字符。 UITextView characterRangeAtPoint 总是返回 nil

    我正在尝试确定其中的哪个特定角色UITextView已被窃听 我尝试使用characterRangeAtPoint 方法 但它总是返回零 无论在哪里UITextView我点击 我什至编写并运行了以下代码 for int x 0 x lt 1
  • 调用未定义函数convert_to_screen()

    我正在开发一个插件 我必须扩展 WP List Table 类 我已经在我的插件文件中扩展了该类 我不知道这是否是正确的方法 并包含 WP List Table 如下所示 if class exists WP List Table requ
  • 在heroku文件系统中写入文件并使用网络应用程序读取它

    我的应用程序中有一个工作进程每小时运行一个脚本 该脚本将数据写入文件系统 Web 应用程序使用该文件系统来更新其内容 我注意到 尽管工作人员成功运行了该进程 但数据并未更新 这是否与heroku的文件系统是只读的这一事实有关 如果是这样 我
  • Git 预接收钩子启动 PHP CodeSniffer [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我想使用 PHP CodeSniffer 检查提交到我的远程 git 存储库的代码 如果代码标准存在任何问题 则拒绝它 有没有人有如何在 git 远程存储库上使用它的示例 或者示例如
  • Visual C++ 中的二进制再现性

    有没有办法在 Visual C 中强制相同的代码生成相同的二进制文件 换句话说 关闭 PE 中的时间戳或强制 PE 中的时间戳为某个固定值 它不仅仅是一个时间戳 还有一个用于 PDB 匹配的嵌入式 GUID 正如 John Robbins
  • Php 检查是否声明了静态类

    如何检查静态类是否已声明 前任 鉴于班级 class bob function yippie echo skippie 稍后在代码中我如何检查 if is a valid static object bob bob yippie 所以我不明
  • 如何关闭xampp中的通知报告?

    在远程服务器上没有问题 但在本地主机 xampp 3 1 中我无法关闭报告通知
  • 从另一个数据库访问用户定义的表类型

    我需要从另一个数据库访问用户定义的表类型 我使用了以下格式 DECLARE Hierarchy AS DatabaseName Schema Table 我收到以下错误 类型名称 DatabaseName Schema Table 包含的内
  • Karma 无法捕获 PhantomJS

    我们已经设置了一个 Jenkins CI 服务器 运行针对 PhantomJS 的 Karma 我们通过 Grunt 运行测试 Jenkins Grunt 和 Phantom 都运行正确 Karma 似乎启动良好 但 Karma 无法捕获
  • 是否可以减少 MongoDB 内存使用量?

    我正在使用 64 位 MongoDB 进行测试 如果我配置大尺寸备份 那么 MongoDB 内存利用率似乎很高 是否有可能减少 MongoDB 的内存利用率 MongoDB 使用 150 MB 内存是否理想
  • 在 Polly 库中使用 httpclient 的指数退避

    我刚刚读到波莉图书馆从桌面代理到服务器进行通信时 我需要处理 3 次重试 目前我喜欢指数退避 但是 我很难理解如何在我的代码中实现这一点 这是我到目前为止所做的 using HttpClient client new HttpClient
  • AutoFixture:模拟方法不返回冻结实例

    我正在尝试编写这个简单的测试 var fixture new Fixture Customize new AutoMoqCustomization var postProcessingAction fixture Freeze