c# - 为什么改变一个方法,而不是它的模拟,会导致测试行为的改变?
问题描述
我最近正在审查一个合同开发人员编写的一些代码,当我发现这个单元测试有一个不寻常的变化(它不完整 - 只发布相关代码)时,他现在离开了公司。
// Arrange
byte[] returnData = new byte[] { 2, 23, 56 };
this.mockCsvMemoryWriter.Setup(writer => writer.WriteCsvToMemory(It.IsAny<IEnumerable<AssetDetailsCsvModel>>())).Returns(returnData);
// Act
var actual = await this.target.GetAssetsDownload(null, null, ListViewModel.AssetStatus.Undefined);
// Assert
actual.ShouldSatisfyAllConditions(
() => actual.ShouldBeAssignableTo<FileStreamResult>().ContentType.ShouldBe("text/csv"),
() => actual.ShouldBeAssignableTo<FileStreamResult>().FileStream.ShouldNotBeNull(),
() => actual.ShouldBeAssignableTo<FileStreamResult>().FileStream.Length.ShouldBeGreaterThan(0));
更改在最后一行,已更改为ShouldBeGreaterThanOrEqualTo(0)
.
奇怪的是,测试的目标,GetAssetsDownload
方法没有改变。它的基础依赖项之一有,但它被模拟了 -writer.WriteCsvToMemory
方法。
鉴于这是被嘲笑的,我不认为它的行为会改变。但确实如此。在更改之前,returnData
字节按预期返回。通过更改,将返回一个空字节数组。
使用调试和断点,我已经验证了在这两种情况下,该方法都使用了模拟,并且没有调用GetAssetsDownload
实际的方法。writer.WriteCsvToMemory
为什么在不更改模拟的情况下更改已模拟的方法会导致测试行为发生变化?
解决方案
推荐阅读
- javascript - Three.js 旋转立方体以在前视图中显示选定的一侧?
- animation - 为什么我收到这个错误,当角色完全加载时?
- vue.js - 当链接在我的过滤数组中时,如何在 vuetify 中加载图像?
- material-ui - 如何将 Material UI 集成到 Svelte 项目中
- docker - confluentinc/cp-zookeeper Docker Image 和 ZooKeeper 的四字单词白名单
- javascript - 如何通过 XMLhttprequest 和多部分/表单正文内容发送视频?视频未发送?
- amazon-s3 - 来自事件 ObjectCreated S3 存储桶 (Node.js) 的 AWS Lambda POST 请求
- html - 如何在materializecss的输入中制作正确的溢出文本?
- namespaces - 'RxODE' 的包或命名空间加载失败。'RxODE' 的 attachNamespace() 中的 onAttach 失败,
- flutter - Flutter - 当长度大于或小于 0 时启用/禁用按钮